Skip to main content

Solidity API

PublicLock (v15)​

PurchaseArgs​

PurchaseArgs struct

Parameters​

NameTypeDescription
struct PurchaseArgs {
uint256 value;
address recipient;
address referrer;
address protocolReferrer;
address keyManager;
bytes data;
uint256 additionalPeriods;
}

initialize​

function initialize(address _lockCreator, uint256 _expirationDuration, address _tokenAddress, uint256 _keyPrice, uint256 _maxNumberOfKeys, string _lockName) external

Functions

DEFAULT_ADMIN_ROLE​

function DEFAULT_ADMIN_ROLE() external view returns (bytes32 role)

publicLockVersion​

function publicLockVersion() external pure returns (uint16)

The version number of the current implementation on this network.

Return Values​

NameTypeDescription
[0]uint16The current version number.

withdraw​

function withdraw(address _tokenAddress, address payable _recipient, uint256 _amount) external

Called by lock manager to withdraw all funds from the lock

Parameters​

NameTypeDescription
_tokenAddressaddressspecifies the token address to withdraw or 0 for ETH. This is usually the same as tokenAddress in MixinFunds.
_recipientaddress payablespecifies the address that will receive the tokens
_amountuint256specifies the max amount to withdraw, which may be reduced when considering the available balance. Set to 0 or MAX_UINT to withdraw everything. -- however be wary of draining funds as it breaks the cancelAndRefund and expireAndRefundFor use cases.

updateKeyPricing​

function updateKeyPricing(uint256 _keyPrice, address _tokenAddress) external

A function which lets a Lock manager of the lock to change the price for future purchases.

Throws if called by other than a Lock manager Throws if lock has been disabled Throws if _tokenAddress is not a valid token

Parameters​

NameTypeDescription
_keyPriceuint256The new price to set for keys
_tokenAddressaddressThe address of the erc20 token to use for pricing the keys, or 0 to use ETH

updateLockConfig​

function updateLockConfig(uint256 _newExpirationDuration, uint256 _maxNumberOfKeys, uint256 _maxKeysPerAcccount) external

Update the main key properties for the entire lock:

  • default duration of each key
  • the maximum number of keys the lock can edit
  • the maximum number of keys a single address can hold

keys previously bought are unaffected by this changes in expiration duration (i.e. existing keys timestamps are not recalculated/updated)

_maxNumberOfKeys Can't be smaller than the existing supply

Parameters​

NameTypeDescription
_newExpirationDurationuint256the new amount of time for each key purchased or type(uint).max for a non-expiring key
_maxNumberOfKeysuint256uint the maximum number of keys
_maxKeysPerAcccountuint256the maximum amount of key a single user can own

getHasValidKey​

function getHasValidKey(address _user) external view returns (bool)

Checks if the user has a non-expired key.

Parameters​

NameTypeDescription
_useraddressThe address of the key owner

keyExpirationTimestampFor​

function keyExpirationTimestampFor(uint256 _tokenId) external view returns (uint256 timestamp)

Returns the key's ExpirationTimestamp field for a given owner. Returns 0 if the owner has never owned a key for this lock

Parameters​

NameTypeDescription
_tokenIduint256the id of the key

numberOfOwners​

function numberOfOwners() external view returns (uint256)

Public function which returns the total number of unique owners (both expired and valid). This may be larger than totalSupply.

setLockMetadata​

function setLockMetadata(string _lockName, string _lockSymbol, string _baseTokenURI) external

Allows the Lock owner to assign

Parameters​

NameTypeDescription
_lockNamestringa descriptive name for this Lock.
_lockSymbolstringa Symbol for this Lock (default to KEY).
_baseTokenURIstringthe baseTokenURI for this Lock

symbol​

function symbol() external view returns (string)

Gets the token symbol

Return Values​

NameTypeDescription
[0]stringstring representing the token symbol

tokenURI​

function tokenURI(uint256 _tokenId) external view returns (string)

A distinct Uniform Resource Identifier (URI) for a given asset.

Throws if _tokenId is not a valid NFT. URIs are defined in RFC 3986. The URI may point to a JSON file that conforms to the "ERC721 Metadata JSON Schema". https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md

Parameters​

NameTypeDescription
_tokenIduint256The tokenID we're inquiring about

Return Values​

NameTypeDescription
[0]stringString representing the URI for the requested token

setEventHooks​

function setEventHooks(address _onKeyPurchaseHook, address _onKeyCancelHook, address _onValidKeyHook, address _onTokenURIHook, address _onKeyTransferHook, address _onKeyExtendHook, address _onKeyGrantHook, address _onHasRoleHook) external

Allows a Lock manager to add or remove an event hook

Parameters​

NameTypeDescription
_onKeyPurchaseHookaddressHook called when the purchase function is called
_onKeyCancelHookaddressHook called when the internal _cancelAndRefund function is called
_onValidKeyHookaddressHook called to determine if the contract should overide the status for a given address
_onTokenURIHookaddressHook called to generate a data URI used for NFT metadata
_onKeyTransferHookaddressHook called when a key is transfered
_onKeyExtendHookaddressHook called when a key is extended or renewed
_onKeyGrantHookaddressHook called when a key is granted
_onHasRoleHookaddressHook called when checking if an address as a specific role

grantKeys​

function grantKeys(address[] _recipients, uint256[] _expirationTimestamps, address[] _keyManagers) external returns (uint256[])

Allows a Lock manager to give a collection of users a key with no charge. Each key may be assigned a different expiration date.

Throws if called by other than a Lock manager

Parameters​

NameTypeDescription
_recipientsaddress[]An array of receiving addresses
_expirationTimestampsuint256[]An array of expiration Timestamps for the keys being granted
_keyManagersaddress[]

Return Values​

NameTypeDescription
[0]uint256[]the ids of the granted tokens

grantKeyExtension​

function grantKeyExtension(uint256 _tokenId, uint256 _duration) external

Allows the Lock owner to extend an existing keys with no charge.

set _duration to 0 to use the default duration of the lock

Parameters​

NameTypeDescription
_tokenIduint256The id of the token to extend
_durationuint256The duration in secondes to add ot the key

purchase​

function purchase(struct PublicLock (v15).PurchaseArgs[] purchaseArgs) external payable returns (uint256[] tokenIds)

Purchase function

Parameters​

NameTypeDescription
purchaseArgsstruct PublicLock (v15).PurchaseArgs[]array of PurchaseArg

Return Values​

NameTypeDescription
tokenIdsuint256[]the ids of the created tokens

purchase​

function purchase(uint256[] _values, address[] _recipients, address[] _referrers, address[] _keyManagers, bytes[] _data) external payable returns (uint256[] tokenIds)

when called for an existing and non-expired key, the _keyManager param will be ignored

Purchase function (legacy) Setting _value to keyPrice exactly doubles as a security feature. That way if the lock owner increases the price while my transaction is pending I can't be charged more than I expected (only applicable to ERC-20 when more than keyPrice is approved for spending).

Parameters​

NameTypeDescription
_valuesuint256[]array of tokens amount to pay for this purchase >= the current keyPrice - any applicable discount (_values is ignored when using ETH)
_recipientsaddress[]array of addresses of the recipients of the purchased key
_referrersaddress[]array of addresses of the users making the referral
_keyManagersaddress[]optional array of addresses to grant managing rights to a specific address on creation
_databytes[]array of arbitrary data populated by the front-end which initiated the sale

Return Values​

NameTypeDescription
tokenIdsuint256[]the ids of the created tokens

extend​

function extend(uint256 _value, uint256 _tokenId, address _referrer, bytes _data) external payable

Extend function Throws if lock is disabled or key does not exist for _recipient. Throws if _recipient == address(0).

Parameters​

NameTypeDescription
_valueuint256the number of tokens to pay for this purchase >= the current keyPrice - any applicable discount (_value is ignored when using ETH)
_tokenIduint256the id of the key to extend
_referreraddressaddress of the user making the referral
_databytesarbitrary data populated by the front-end which initiated the sale

referrerFees​

function referrerFees(address _referrer) external view returns (uint256 referrerFee)

Returns the percentage of the keyPrice to be sent to the referrer (in basis points)

Parameters​

NameTypeDescription
_referreraddressthe address of the referrer

Return Values​

NameTypeDescription
referrerFeeuint256the percentage of the keyPrice to be sent to the referrer (in basis points)

setReferrerFee​

function setReferrerFee(address _referrer, uint256 _feeBasisPoint) external

Set a specific percentage of the keyPrice to be sent to the referrer while purchasing, extending or renewing a key.

To send a fixed percentage of the key price to all referrers, sett a percentage to address(0)

Parameters​

NameTypeDescription
_referreraddressthe address of the referrer
_feeBasisPointuint256the percentage of the price to be used for this specific referrer (in basis points)

mergeKeys​

function mergeKeys(uint256 _tokenIdFrom, uint256 _tokenIdTo, uint256 _amount) external

Merge existing keys

Parameters​

NameTypeDescription
_tokenIdFromuint256the id of the token to substract time from
_tokenIdTouint256the id of the destination token to add time
_amountuint256the amount of time to transfer (in seconds)

burn​

function burn(uint256 _tokenId) external

Deactivate an existing key the key will be expired and ownership records will be destroyed

Parameters​

NameTypeDescription
_tokenIduint256the id of token to burn

setGasRefundValue​

function setGasRefundValue(uint256 _gasRefundValue) external

Set the value to be refunded to the sender on purchase

Parameters​

NameTypeDescription
_gasRefundValueuint256price in wei or token in smallest price unit

gasRefundValue​

function gasRefundValue() external view returns (uint256 _gasRefundValue)

_gasRefundValue price in wei or token in smallest price unit

Returns the value/price to be refunded to the sender on purchase

purchasePriceFor​

function purchasePriceFor(address _recipient, address _referrer, bytes _data) external view returns (uint256)

returns the minimum price paid for a purchase with these params.

this considers any discount from Unlock or the OnKeyPurchase hook.

updateTransferFee​

function updateTransferFee(uint256 _transferFeeBasisPoints) external

Allow a Lock manager to change the transfer fee.

Throws if called by other than a Lock manager

Parameters​

NameTypeDescription
_transferFeeBasisPointsuint256The new transfer fee in basis-points(bps). Ex: 200 bps = 2%

getTransferFee​

function getTransferFee(uint256 _tokenId, uint256 _time) external view returns (uint256)

Determines how much of a fee would need to be paid in order to transfer to another account. This is pro-rated so the fee goes down overtime.

Throws if _tokenId does not have a valid key

Parameters​

NameTypeDescription
_tokenIduint256The id of the key check the transfer fee for.
_timeuint256The amount of time to calculate the fee for.

Return Values​

NameTypeDescription
[0]uint256The transfer fee in seconds.

expireAndRefundFor​

function expireAndRefundFor(uint256 _tokenId, uint256 _amount) external

Invoked by a Lock manager to expire the user's key and perform a refund and cancellation of the key Throws if called by other than a Lock manager Throws if _keyOwner does not have a valid key

Parameters​

NameTypeDescription
_tokenIduint256The key id we wish to refund to
_amountuint256The amount to refund to the key-owner

cancelAndRefund​

function cancelAndRefund(uint256 _tokenId) external

cancel is enabled with a 10% penalty by default on all Locks.

allows the key manager to expire a given tokenId and send a refund to the keyOwner based on the amount of time remaining.

Parameters​

NameTypeDescription
_tokenIduint256The id of the key to cancel.

updateRefundPenalty​

function updateRefundPenalty(uint256 _freeTrialLength, uint256 _refundPenaltyBasisPoints) external

Allow a Lock manager to change the refund penalty.

Throws if called by other than a Lock manager

Parameters​

NameTypeDescription
_freeTrialLengthuint256The new duration of free trials for this lock
_refundPenaltyBasisPointsuint256The new refund penaly in basis-points(bps)

getCancelAndRefundValue​

function getCancelAndRefundValue(uint256 _tokenId) external view returns (uint256 refund)

Due to the time required to mine a tx, the actual refund amount will be lower than what the user reads from this call.

Determines how much of a refund a key owner would receive if they issued

Parameters​

NameTypeDescription
_tokenIduint256the id of the token to get the refund value for.

Return Values​

NameTypeDescription
refunduint256the amount of tokens refunded

isLockManager​

function isLockManager(address account) external view returns (bool)

onKeyPurchaseHook​

function onKeyPurchaseHook() external view returns (address hookAddress)

Returns the address of the onKeyPurchaseHook hook.

Return Values​

NameTypeDescription
hookAddressaddressaddress of the hook

onKeyCancelHook​

function onKeyCancelHook() external view returns (address hookAddress)

Returns the address of the onKeyCancelHook hook.

Return Values​

NameTypeDescription
hookAddressaddressaddress of the hook

onValidKeyHook​

function onValidKeyHook() external view returns (address hookAddress)

Returns the address of the onValidKeyHook hook.

Return Values​

NameTypeDescription
hookAddressaddressaddress of the hook

onTokenURIHook​

function onTokenURIHook() external view returns (address hookAddress)

Returns the address of the onTokenURIHook hook.

Return Values​

NameTypeDescription
hookAddressaddressaddress of the hook

onKeyTransferHook​

function onKeyTransferHook() external view returns (address hookAddress)

Returns the address of the onKeyTransferHook hook.

Return Values​

NameTypeDescription
hookAddressaddressaddress of the hook

onKeyExtendHook​

function onKeyExtendHook() external view returns (address hookAddress)

Returns the address of the onKeyExtendHook hook.

Return Values​

NameTypeDescription
hookAddressaddressthe address ok the hook

onKeyGrantHook​

function onKeyGrantHook() external view returns (address hookAddress)

Returns the address of the onKeyGrantHook hook.

Return Values​

NameTypeDescription
hookAddressaddressthe address ok the hook

onHasRoleHook​

function onHasRoleHook() external view returns (address hookAddress)

Returns the address of the onHasRoleHook hook.

Return Values​

NameTypeDescription
hookAddressaddressthe address ok the hook

maxKeysPerAddress​

function maxKeysPerAddress() external view returns (uint256)

Return Values​

NameTypeDescription
[0]uint256the maximum number of key allowed for a single address

expirationDuration​

function expirationDuration() external view returns (uint256)

freeTrialLength​

function freeTrialLength() external view returns (uint256)

keyPrice​

function keyPrice() external view returns (uint256)

maxNumberOfKeys​

function maxNumberOfKeys() external view returns (uint256)

refundPenaltyBasisPoints​

function refundPenaltyBasisPoints() external view returns (uint256)

tokenAddress​

function tokenAddress() external view returns (address)

transferFeeBasisPoints​

function transferFeeBasisPoints() external view returns (uint256)

unlockProtocol​

function unlockProtocol() external view returns (address)

keyManagerOf​

function keyManagerOf(uint256) external view returns (address)

shareKey​

function shareKey(address _to, uint256 _tokenId, uint256 _timeShared) external

Allows the key owner to safely share their key (parent key) by transferring a portion of the remaining time to a new key (child key).

Throws if key is not valid. Throws if _to is the zero address Emit Transfer event

Parameters​

NameTypeDescription
_toaddressThe recipient of the shared key
_tokenIduint256the key to share
_timeShareduint256The amount of time shared checks if _to is a smart contract (code size > 0). If so, it calls onERC721Received on _to and throws if the return value is not bytes4(keccak256('onERC721Received(address,address,uint,bytes)')).

setKeyManagerOf​

function setKeyManagerOf(uint256 _tokenId, address _keyManager) external

Update transfer and cancel rights for a given key

Parameters​

NameTypeDescription
_tokenIduint256The id of the key to assign rights for
_keyManageraddressThe address to assign the rights to for the given key

isValidKey​

function isValidKey(uint256 _tokenId) external view returns (bool)

Check if a certain key is valid this makes use of the onValidKeyHook if it is set

Parameters​

NameTypeDescription
_tokenIduint256the id of the key to check validity

totalKeys​

function totalKeys(address _keyOwner) external view returns (uint256 numberOfKeys)

Returns the number of keys owned by _keyOwner (expired or not)

Parameters​

NameTypeDescription
_keyOwneraddressaddress for which we are retrieving the total number of keys

Return Values​

NameTypeDescription
numberOfKeysuint256total number of keys owned by the address

name​

function name() external view returns (string _name)

A descriptive name for a collection of NFTs in this contract

supportsInterface​

function supportsInterface(bytes4 interfaceId) external view returns (bool)

From ERC165.sol

balanceOf​

function balanceOf(address _owner) external view returns (uint256 balance)

In the specific case of a Lock, balanceOf returns only the tokens with a valid expiration timerange

Return Values​

NameTypeDescription
balanceuint256The number of valid keys owned by _keyOwner

ownerOf​

function ownerOf(uint256 tokenId) external view returns (address _owner)

Returns the owner of the NFT specified by tokenId.

safeTransferFrom​

function safeTransferFrom(address from, address to, uint256 tokenId) external

_Transfers a specific NFT (tokenId) from one account (from) to another (to).

Requirements:

  • from, to cannot be zero.
  • tokenId must be owned by from.
  • If the caller is not from, it must be have been allowed to move this approve_

safeTransferFrom​

function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) external

transferFrom​

function transferFrom(address from, address to, uint256 tokenId) external

an ERC721-like function to transfer a token from one account to another.

Requirements: if the caller is not from, it must be approved to move this token by approve The key manager will be reset to address zero after the transfer

Parameters​

NameTypeDescription
fromaddressthe owner of token to transfer
toaddressthe address that will receive the token
tokenIduint256the id of the token

lendKey​

function lendKey(address from, address to, uint256 tokenId) external

Lending a key allows you to transfer the token while retaining the ownerships right by setting yourself as a key manager first. This function can only be called by 1) the key owner when no key manager is set or 2) the key manager. After calling the function, the _recipent will be the new owner, and the sender of the tx will become the key manager.

Parameters​

NameTypeDescription
fromaddressthe owner of token to transfer
toaddressthe address that will receive the token
tokenIduint256the id of the token

unlendKey​

function unlendKey(address _recipient, uint256 _tokenId) external

Unlend is called when you have lent a key and want to claim its full ownership back.

Only the key manager of the token can call this function

Parameters​

NameTypeDescription
_recipientaddressthe address that will receive the token ownership
_tokenIduint256the id of the token

approve​

function approve(address to, uint256 tokenId) external

getApproved​

function getApproved(uint256 _tokenId) external view returns (address operator)

Get the approved address for a single NFT

Throws if _tokenId is not a valid NFT.

Parameters​

NameTypeDescription
_tokenIduint256The NFT to find the approved address for

Return Values​

NameTypeDescription
operatoraddressThe approved address for this NFT, or the zero address if there is none

totalSupply​

function totalSupply() external view returns (uint256 _totalKeysCreated)

Returns the total number of keys, including non-valid ones

Return Values​

NameTypeDescription
_totalKeysCreateduint256the total number of keys, valid or not

tokenOfOwnerByIndex​

function tokenOfOwnerByIndex(address _owner, uint256 index) external view returns (uint256 tokenId)

tokenByIndex​

function tokenByIndex(uint256 index) external view returns (uint256)

getRoleAdmin​

function getRoleAdmin(bytes32 role) external view returns (bytes32)

Innherited from Open Zeppelin AccessControl.sol

grantRole​

function grantRole(bytes32 role, address account) external

revokeRole​

function revokeRole(bytes32 role, address account) external

renounceRole​

function renounceRole(bytes32 role, address account) external

hasRole​

function hasRole(bytes32 role, address account) external view returns (bool)

owner​

function owner() external view returns (address owner)

owner() is provided as an helper to mimick the Ownable contract ABI. The Ownable logic is used by many 3rd party services to determine contract ownership - e.g. who is allowed to edit metadata on Opensea.

This logic is NOT used internally by the Unlock Protocol and is made available only as a convenience helper.

setOwner​

function setOwner(address account) external

isOwner​

function isOwner(address account) external view returns (bool isOwner)

migrate​

function migrate(bytes _calldata) external

Migrate data from the previous single owner => key mapping to the new data structure w multiple tokens.

when all record schemas are sucessfully upgraded, this function will update the schemaVersion variable to the latest/current lock version

Parameters​

NameTypeDescription
_calldatabytesan ABI-encoded representation of the params (v10: the number of records to migrate as uint)

renewMembershipFor​

function renewMembershipFor(uint256 _tokenId, address _referrer) external

Renew a given token only works for non-free, expiring, ERC20 locks

Parameters​

NameTypeDescription
_tokenIduint256the ID fo the token to renew
_referreraddressthe address of the person to be granted UDT

setKeyExpiration​

function setKeyExpiration(uint256 _tokenId, uint256 _newExpiration) external

Set the expiration of a key only a lock manager can call this function

Parameters​

NameTypeDescription
_tokenIduint256the id of the key
_newExpirationuint256the new timestamp to use

isRenewable​

function isRenewable(uint256 tokenId, address referrer) external view returns (bool)

helper to check if a key is currently renewable it will revert if the pricing or duration of the lock have been modified unfavorably since the key was bought(price increase or duration decrease). It will also revert if a lock is not renewable or if the key is not ready for renewal yet (at least 90% expired).

Parameters​

NameTypeDescription
tokenIduint256the id of the token to check
referreraddressthe address where to send the referrer fee

Return Values​

NameTypeDescription
[0]booltrue if the terms has changed