Used to voluntarily lock IdeaTokens for a specified duration.

This contract uses a doubly linked list to keep track of locked tokens and allow for iteration. For each (IdeaToken, owner) combination a linked list is stored where new entries to the list are inserted at the head:

|-----------| --- next ---> |-----------| | LLEntry | | LLEntry | ---- > |-----------| <--- prev --- |-----------| | | _llHead[IdeaToken][owner]

Each LLEntry has an until field which is the timestamp when the tokens in this entry will be unlocked. A (IdeaToken, owner, until) combination uniquely identifies a LLEntry. Thus the until also often serves as an ID.

Since (IdeaToken, owner, until) is unique, the storage location of each LLEntry is calculated as keccak256(abi.encode(ideaToken, owner, until)).


  • lock: Locks IdeaTokens for a specified duration

    • address ideaToken: The address of the IdeaToken to be locked

    • uint amount: The amount of IdeaTokens to lock

    • uint duration: The duration in seconds to lock the IdeaTokens

    • address recipient: The account to credit the locked IdeaTokens

  • withdraw: Withdraw IdeaTokens which have exceeded their locking period

    • address ideaToken: The address of the IdeaToken to withdraw

    • uint[] untils: An array of timestamps which corresponds to the end of the locking period of the entries to be withdrawn.

    • address recipient: The account which will receive the IdeaTokens

  • getLockedEntries: Returns an array of all locked entries for an account and IdeaToken

    • address ideaToken: The IdeaToken for which to return the locked entries

    • address user: The address of the user for which to return the locked entries

    • uint maxEntries: The maximum number of entries to return