Skip to content
Prev Previous commit
Next Next commit
feat: add NonceTracker
  • Loading branch information
shrugs committed May 30, 2018
commit 0d09184c8aaf49e35d6414b11c35cd71a0472d73
4 changes: 3 additions & 1 deletion contracts/access/ERC721Minter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ pragma solidity ^0.4.23;

import "../token/ERC721/MintableERC721Token.sol";
import "./SignatureBouncer.sol";
import "./NonceTracker.sol";

/**
* @title ERC721Minter
Expand All @@ -14,7 +15,7 @@ import "./SignatureBouncer.sol";
* @dev 4. Generate a valid bouncer signature and submit it to the ERC721Minter using `mint`
* @dev Override `mint()` to add tokenURI information.
*/
contract ERC721Minter is SignatureBouncer {
contract ERC721Minter is SignatureBouncer, NonceTracker {
MintableERC721Token public token;

constructor(MintableERC721Token _token)
Expand All @@ -25,6 +26,7 @@ contract ERC721Minter is SignatureBouncer {

function mint(bytes _sig)
onlyValidSignature(_sig)
withAccess(msg.sender, 1)
public
returns (uint256)
{
Expand Down
30 changes: 30 additions & 0 deletions contracts/access/NonceTracker.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
pragma solidity ^0.4.23;


contract NonceTracker {
mapping(address => uint256) private nonces;

modifier withAccess(address _address, uint256 _nonce)
{
access(_address, _nonce);
_;
}

function nonce(address _address)
public
returns (uint256)
{
return nonces[_address];
}

/**
* @dev call this function when accepting a nonce
* @dev throws if nonce is not strictly greater than previous nonce
*/
function access(address _address, uint256 _nonce)
internal
{
require(_nonce > nonces[_address]);
nonces[_address] = _nonce;
}
}