I’ve been having ‘fun’ developing an ERC777 contract setup. I may have it working, but I have a whole bunch of questions about _mint_, erc1820.setManager, erc1820.setInterfaceImplementer and the hook tokensToSend.
To keep this as brief as possible, I’m going to gloss over much of the pain I’ve been through 
First, most of my issues seem to be with who receives newly minted tokens. When minting with msg.sender (i.e. the contract owner): _mint( msg.sender, msg.sender, _initialSupply, "", "" );, I’ve been unable to set any of my defaultOperators as a manager of the msg.sender address, and consequently, I’ve been unable to hook into tokensToSend (amongst other issues).
Instead, my token constructor gives the minted tokens to itself, i.e. _mint( address(this), address(this), _initialSupply, "", "" );. Afterwards, I do this: erc1820.setManager( address(this), _defaultOperators[0] );.
Then my token manager (_defaultOperators[0]), is passed the token, and calls erc1820.setInterfaceImplementer( address(token), TOKENS_SENDER_INTERFACE_HASH, address(this) );. That means it can send tokens, token.operatorSend( address(token), _recipient, _amount, "", _buyData );, which successfully hooks into tokensToSend (since my token manager is a IERC777Sender, and all seems to behave properly. Huzzah!
Is that correct? Can the ERC777 token contract give itself the tokens? Have I called erc1820.setManager and erc1820.setInterfaceImplementer correctly?
As I said, it all seems to behave correctly. However, when I deploy my token contracts to Ganache, I send an address some of my tokens via my contracts. Unfortunately, after adding the token to an address under MetaMask, the account shows 0 tokens, instead of the amount sent. Eek!
Apologies for the (probably) nonsensical posting, but any help/guidance/hugs are much appreciated 