Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/erc777 #1159 #1684

Merged
merged 68 commits into from
Apr 16, 2019
Merged
Show file tree
Hide file tree
Changes from 47 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
fe15d14
IERC777 from specs, constants returned, up to defaultOperators. (#1159)
utgarda Oct 7, 2018
1d26da3
IERC777 oprarator approvals (#1159)
utgarda Oct 7, 2018
ebb4fad
ERC777 oprarator approvals fixes and tests
utgarda Oct 9, 2018
73ac6af
IERC777 send and receive with ERC820 (#1159)
Oct 24, 2018
9a6ed29
ERC777 Add burn functions and fix send functions (#1159)
Oct 27, 2018
2fc7b4d
ERC777 Make expectEvent compatible with web3.js 1.0 (#1159)
Nov 3, 2018
5920482
ERC777 Add ERC820 deploy script (#1159)
Nov 3, 2018
fc63684
ERC777 Complete implementation of ERC777 (#1159)
Nov 3, 2018
be6fcd1
ERC777 Update ERC820 Registry contract to final version (#1159)
Jan 31, 2019
2db4656
ERC777 Move contracts to 'drafts' folder (#1159)
Jan 31, 2019
d9e53d9
ERC777: Update to ERC1820 registry and linter error fix (#1159)
Mar 15, 2019
e54490a
ERC777: implement recent changes of EIP777 (#1159)
Mar 15, 2019
5695639
ERC777 Fix formatting (#1159)
Mar 17, 2019
9965393
Merge branch 'master' into feature/ERC777-#1159
Mar 17, 2019
2582a2a
ERC777 Update to solc 0.5.2 (#1159)
Mar 17, 2019
7f7d296
ERC777 Fix travis CI errors (#1159)
Mar 21, 2019
990073f
ERC777 Fix linter errors again... (#1159)
Mar 21, 2019
17930e5
ERC777 Fix unit test (#1159)
Mar 21, 2019
65257d5
ERC777 Fix unit test again (#1159)
Mar 21, 2019
d98ef86
Remove extra newlines.
nventuro Mar 26, 2019
831b367
Rename ERC777Base to ERC777.
nventuro Mar 26, 2019
f1df62d
Remove 'Token' from contract names.
nventuro Mar 26, 2019
00df2b6
Replace ops for operators.
nventuro Mar 26, 2019
5a0195a
Move operator check out of _send.
nventuro Mar 26, 2019
06fd3a9
Remove ERC777Burnable.
nventuro Mar 26, 2019
b354c5e
Merge branch 'master' into feature/ERC777-#1159
nventuro Mar 26, 2019
4528200
Remove ERC1820Client, now using the interface directly.
nventuro Mar 26, 2019
9d44f7c
Minor internal refactors in contracts.
nventuro Mar 26, 2019
4d383d4
Delete extra test helpers.
nventuro Mar 26, 2019
dc91c59
Simplified tests.
nventuro Mar 27, 2019
5538764
Add basic 777 tests.
nventuro Mar 27, 2019
e9936f7
Add granularity send test.
nventuro Mar 27, 2019
5c0ee8a
Add first operator send tests.
nventuro Mar 27, 2019
824cb94
Add burn tests.
nventuro Mar 27, 2019
de529bb
Refactor send and burn tests.
nventuro Mar 27, 2019
ee159b4
Improve send burn refactor.
nventuro Mar 27, 2019
f9ada94
Greatly improve test module.
nventuro Mar 28, 2019
37ad5d5
Burn instead of send removed tokens.
nventuro Mar 28, 2019
a76a1cc
Add operator tests.
nventuro Mar 28, 2019
1823108
Improve send tests under changing operators.
nventuro Mar 28, 2019
0e78a62
Refactor and merge send and burn tests.
nventuro Mar 28, 2019
6cdaa1f
Add missing and not-implemented tests.
nventuro Apr 4, 2019
29134fe
Make _burn private.
nventuro Apr 4, 2019
d272f5b
Fix typo.
nventuro Apr 4, 2019
b39d65e
Greatly improve tokensToSend tests.
nventuro Apr 6, 2019
a6d39ce
Refactor hook tests.
nventuro Apr 6, 2019
71c8698
Fix hook tests.
nventuro Apr 9, 2019
060119f
Update openzeppelin-test-helpers and ERC1820 address.
nventuro Apr 11, 2019
01c74fb
Fix natspec indentation.
nventuro Apr 11, 2019
100a1cb
Make interface functions external.
nventuro Apr 11, 2019
b17f6c5
Remove redundant private revoke and authorize functions.
nventuro Apr 11, 2019
2945463
Improved readability of if statement.
nventuro Apr 11, 2019
029a021
Remove unnecessary asserts.
nventuro Apr 11, 2019
db2b2f5
Add non-one granularity test.
nventuro Apr 11, 2019
3518525
Fix hook call order in _mint.
nventuro Apr 11, 2019
7e91c3f
Fix _mint not reverting on failure to implement tokensReceived.
nventuro Apr 11, 2019
2cff2ce
Remove special case in operatorFn when from is 0.
nventuro Apr 11, 2019
cec8ebe
Refactor ERC777SenderMock.
nventuro Apr 11, 2019
8e2af46
Add tokensReceived tests.
nventuro Apr 11, 2019
ad40a92
switch to updated ganache-cli-coverage fork
frangio Apr 6, 2019
480407b
Merge branch 'master' into feature/ERC777-#1159
nventuro Apr 11, 2019
1f8b3d6
Fix linter errors.
nventuro Apr 11, 2019
343cc51
Merge branch 'feature/ERC777-#1159' of github.com:catageek/openzeppel…
nventuro Apr 11, 2019
1feeac3
Add mint tests.
nventuro Apr 12, 2019
1b04f88
Fix linter errors.
nventuro Apr 12, 2019
455e84a
Fix tests.
nventuro Apr 15, 2019
3dd46a0
Update test/drafts/ERC777/ERC777.test.js
frangio Apr 15, 2019
d7be2a6
Add changelog entry.
nventuro Apr 16, 2019
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
402 changes: 402 additions & 0 deletions contracts/drafts/ERC777/ERC777.sol

Large diffs are not rendered by default.

61 changes: 61 additions & 0 deletions contracts/drafts/ERC777/IERC777.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
pragma solidity ^0.5.2;

/**
* @title ERC777 token interface
* @dev See https://eips.ethereum.org/EIPS/eip-777
*/
interface IERC777 {
function authorizeOperator(address operator) external;

function revokeOperator(address operator) external;

function send(address to, uint256 amount, bytes calldata data) external;

function operatorSend(
address from,
address to,
uint256 amount,
bytes calldata data,
bytes calldata operatorData
) external;

function burn(uint256 amount, bytes calldata data) external;

function operatorBurn(
address from,
uint256 amount,
bytes calldata data,
bytes calldata operatorData
) external;

function name() external view returns (string memory);

function symbol() external view returns (string memory);

function totalSupply() external view returns (uint256);

function balanceOf(address owner) external view returns (uint256);

function granularity() external view returns (uint256);

function defaultOperators() external view returns (address[] memory);

function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

event Sent(
address indexed operator,
address indexed from,
address indexed to,
uint256 amount,
bytes data,
bytes operatorData
);

event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

event RevokedOperator(address indexed operator, address indexed tokenHolder);
}
16 changes: 16 additions & 0 deletions contracts/drafts/ERC777/IERC777Recipient.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
pragma solidity ^0.5.2;

/**
* @title ERC777 token recipient interface
* @dev See https://eips.ethereum.org/EIPS/eip-777
*/
interface IERC777Recipient {
function tokensReceived(
address operator,
address from,
address to,
uint amount,
bytes calldata userData,
bytes calldata operatorData
) external;
}
16 changes: 16 additions & 0 deletions contracts/drafts/ERC777/IERC777Sender.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
pragma solidity ^0.5.2;

/**
* @title ERC777 token sender interface
* @dev See https://eips.ethereum.org/EIPS/eip-777
*/
interface IERC777Sender {
function tokensToSend(
address operator,
address from,
address to,
uint amount,
bytes calldata userData,
bytes calldata operatorData
) external;
}
16 changes: 16 additions & 0 deletions contracts/mocks/ERC777Mock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
pragma solidity ^0.5.2;

import "../drafts/ERC777/ERC777.sol";

contract ERC777Mock is ERC777 {
constructor (
address initialHolder,
uint256 initialBalance,
string memory name,
string memory symbol,
uint256 granularity,
address[] memory defaultOperators
) public ERC777(name, symbol, granularity, defaultOperators) {
_mint(msg.sender, initialHolder, initialBalance, "", "");
}
}
63 changes: 63 additions & 0 deletions contracts/mocks/ERC777ReceiverMock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
pragma solidity ^0.5.2;

import "../drafts/ERC777/IERC777Recipient.sol";
import "../drafts/IERC1820Registry.sol";

/**
* @title ERC777TokensRecipientMock a contract that implements tokensReceived() hook
* @author Bertrand Masius <[email protected]>
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-777.md
*/
contract ERC777ReceiverMock is IERC777Recipient {

IERC1820Registry private _erc1820 = IERC1820Registry(0x1820b744B33945482C17Dc37218C01D858EBc714);

event TokensReceived(
address indexed operator,
address indexed from,
address indexed to,
uint256 amount,
bytes data,
bytes operatorData
);

constructor(bool setInterface) public {
// register interface
if (setInterface) {
_erc1820.setInterfaceImplementer(
address(this),
keccak256("ERC777TokensRecipient"),
address(this)
);
}
}

/**
* @dev tokensReceived() hook
* @param operator address operator requesting the transfer
* @param from address token holder address
* @param to address recipient address
* @param amount uint256 amount of tokens to transfer
* @param userData bytes extra information provided by the token holder (if any)
* @param operatorData bytes extra information provided by the operator (if any)
*/
function tokensReceived(
address operator,
address from,
address to,
uint256 amount,
bytes calldata userData,
bytes calldata operatorData
)
external
{
emit TokensReceived(
operator,
from,
to,
amount,
userData,
operatorData
);
}
}
80 changes: 80 additions & 0 deletions contracts/mocks/ERC777SenderMock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
pragma solidity ^0.5.2;

import "../drafts/ERC777/IERC777.sol";
import "../drafts/ERC777/IERC777Sender.sol";
import "../drafts/IERC1820Registry.sol";
import "../drafts/ERC1820Implementer.sol";

contract ERC777SenderMock is IERC777Sender, ERC1820Implementer {
event TokensToSendCalled(
address operator,
address from,
address to,
uint256 amount,
bytes data,
bytes operatorData,
address token,
uint256 fromBalance,
uint256 toBalance
);

bool private _shouldRevert;
IERC1820Registry private _erc1820 = IERC1820Registry(0x1820b744B33945482C17Dc37218C01D858EBc714);

bytes32 constant private TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");

constructor(address account) public {
if (account != address(0)) {
_registerInterfaceForAddress(TOKENS_SENDER_INTERFACE_HASH, account);
} else {
address self = address(this);
_registerInterfaceForAddress(TOKENS_SENDER_INTERFACE_HASH, self);
_erc1820.setInterfaceImplementer(self, TOKENS_SENDER_INTERFACE_HASH, self);
}
}

function tokensToSend(
address operator,
address from,
address to,
uint amount,
bytes calldata userData,
bytes calldata operatorData
) external {
if (_shouldRevert) {
revert();
}

IERC777 token = IERC777(msg.sender);

uint256 fromBalance = token.balanceOf(from);
// when called due to burn, to will be the zero address, which will have a balance of 0
uint256 toBalance = token.balanceOf(to);

emit TokensToSendCalled(
operator,
from,
to,
amount,
userData,
operatorData,
address(token),
fromBalance,
toBalance
);
}

function setShouldRevert(bool shouldRevert) public {
_shouldRevert = shouldRevert;
}

function send(IERC777 token, address to, uint256 amount, bytes memory data) public {
// This is 777's send function, not the Solidity send function
token.send(to, amount, data); // solhint-disable-line check-send-result
}

function burn(IERC777 token, uint256 amount, bytes memory data) public {
token.burn(amount, data);
}
}

Loading