# Contract
###### tags: `Kurate`
```solidity=
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@semaphore-protocol/contracts/interfaces/ISemaphore.sol";
contract OutletPublishing {
event NewPost(bytes32 post);
event NewPlayer(uint256 identityCommitment, uint256 charId);
event NewCharacter(uint256 charId);
ISemaphore public semaphore;
constructor(address semaphoreAddress) {
semaphore = ISemaphore(semaphoreAddress);
}
function createCharacter(uint256 _charId) external {
semaphore.createGroup(_charId, 20, 0, address(this));
emit NewCharacter(_charId);
}
function joinCharacter(uint256 _charId, uint256 identityCommitment)
external
{
semaphore.addMember(_charId, identityCommitment);
emit NewPlayer(identityCommitment, _charId);
}
function post(
uint256 charId,
bytes32 post,
uint256 merkleTreeRoot,
uint256 nullifierHash,
uint256[8] calldata proof
) external {
semaphore.verifyProof(
charId,
merkleTreeRoot,
post,
nullifierHash,
proof
);
emit NewPost(post);
}
}
```