# Hemergy contracts
The following sections constitue a mere translation of the contracts' native specifications into a human-friendlier documentation. As for any handwritten documentation (it seems every NatSpec-to-HTML translators libraries are deprecated), bear in mind the following might not perfectly reflect the contracts' code as time and commits pass.
## Factory.sol
### Reason of being
The factory contract is the originator of the beneficiaries, investors and project-specific escrow and ERC20 contracts. While there is a single instance of the beneficiaries and investors contracts per factory instance, there can be thousands of escrow and ERC20 contracts instances. Anybody can instanciate these latter contracts through a public entrypoint. The contract's storage keeps track of the factory-instanciated - understand legit - escrow's and ERC20's public addresses, to ensure no one can bypass it to instanciate new counterfeit escrow/ERC2 contracts.
### Entrypoints
#### createNewEscrow
Creates a new escrow contract instance along with its associated token.
|Parameters | Description |
|:----------|:------------|
|lockDuration | The delay, expressed in seconds, during which funds cannot be withdrawn from the contract. |
|maxInvestors | The maximum number of investors. |
|entryTicket | The minimum value a user can send to the contract. |
|midCap | The minimum contract's balance needed to lock funds. |
|maxEquity | The maximum mid cap percentage a user can send to the contract. |
|Return | Description |
|:----------|:------------|
|t | A tuple comprising the public addresses of the escrow and token contracts instances. |
#### changeTokenParameters
Changes escrow-specific tokens optional parameters.
|Parameters | Description |
|:----------|:------------|
| \_initialAmount | The total token supply. |
| \_tokenName | The token's name. |
| \_decimalUnits | The token's number of decimals. |
| \_tokenSymbol | The token's symbol. |
#### getInvestorsListAddress (view)
Gets the genuine investors list contract address. The investors list contract is created along with the factory contract.
|Return | Description |
|:----------|:------------|
| investorsContractAddress | The investors list contract address. |
#### getBeneficiariesListAddress (view)
Gets the factory-instantiated beneficiaries list contract address. The investors list contract is created along with the factory contract.
|Return | Description |
|:----------|:------------|
|beneficiariesContractAddress | The investors list contract address. |
#### checkIfContractIsEscrow (view)
Tells whether an input contract is an authentic escrow contract.
|Parameters | Description |
|:----------|:------------|
|escrowContractAddress | The address of the deployed escrow contract. |
|Return | Description |
|:----------|:------------|
| isEscrow | A boolean stating whether or not the input address is a known escrow contract. |
#### checkIfContractIsToken (view)
Checks whether a deployed contract is an authentic escrow-specific token contract.
|Parameters | Description |
|:----------|:------------|
| token | The token contract address to be tested. |
|Return | Description |
|:----------|:------------|
| isToken | A boolean stating whether the input address is a known token contract. |
### Events
#### InvestorsContractCreated
Emitted whenever a new investors list is instantiated.
|Parameters | Description |
|:----------|:------------|
| investorsContractAddress | The investors contract address. |
#### BeneficiariesContractCreated
Emitted whenever a new investors list is instantiated.
|Parameters | Description |
|:----------|:------------|
| beneficiariesContractAddress | The investors contract address. |
#### EscrowContractCreated
Emitted whenever a new escrow contract is instantiated.
|Parameters | Description |
|:----------|:------------|
| escrow | The escrow contract address. |
|token | The escrow-specific token contract address. |
### Errors
#### UserIsNotAdmin
The message sender needs to have admin rights to perform this action.
## Beneficiaries.sol
### Reason of being
This contract keeps track of the approved projects' beneficiaries - the public addresses which are allowed to receive funds by the end of a fundraising process.
### Entrypoints
#### approveBeneficiary
Marks the provided public address as approved. The provided public address cannot be marked as approved beforehand.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The public address to approve. |
#### revokeBeneficiary
Marks the provided public address as unapproved. The provided public address cannot be unmarked if it was not approved in the first place.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The public address to revoke. |
#### isApproved (view)
Returns whether the provided public address is marked as approved.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The public address to assess. |
|Return | Description |
|:----------|:------------|
|approved | A boolean that evaluates to true when the public address is approved. |
### Errors
#### ContractIsNotBeneficiariesList (contract-related error)
This escrow contract does not belong to the whitelisted beneficiaries contracts list.
#### SenderIsNotAdmin (entrypoint error)
No one but the contract's administrator can perform this action.
#### BeneficiaryIsAlreadyApproved (entrypoint error)
The provided beneficiary has already been approved by the contract's admin.
#### BeneficiaryNeedsToBeApproved (entrypoint error)
The provided beneficiary needs to be approved in order to be revoked.
## Investors.sol
### Reason of being
This contract keeps track of the approved projects' investors - the public addresses which are allowed to invest in a project.
### Entrypoints
#### approveInvestor
Marks the provided public address as approved. The provided public address cannot be marked as approved beforehand.
|Parameters | Description |
|:----------|:------------|
| investor | The public address to approve. |
#### revokeInvestor
Marks the provided public address as unapproved. The provided public address cannot be unmarked if it was not approved in the first place.
|Parameters | Description |
|:----------|:------------|
| investor | The public address to revoke. |
#### isApproved (view)
Returns whether or not the provided public address is marked as approved.
|Parameters | Description |
|:----------|:------------|
| investor | The public address to assess. |
|Return | Description |
|:----------|:------------|
| approved | A boolean that evaluates to true when the public address is approved. |
### Errors
#### ContractIsNotInvestorsList (contract-related error)
This escrow contract does not belong to the whitelisted investors contracts list.
#### SenderIsNotAdmin (entrypoint error)
No one but the contract's administrator can perform this action.
#### InvestorIsAlreadyApproved (entrypoint error)
The provided investor has already been approved by the contract's admin.
#### InvestorNeedsToBeApproved (entrypoint error)
The provided investor needs to be approved in order to be revoked.
## Escrow.sol
### Reason of being
This contract keeps track of the state of a specific fundraising process and stores the investors' funds.
### Entrypoints
#### addBeneficiary
Marks a public address as a project's beneficiary along with its share.
|Parameters | Description |
|:----------|:------------|
| beneficiary | A public address which will be sent an ethers share by the end of the fundraising. |
| share | An integer comprised between 0 and 100 that describes the proportion of funds the beneficiary will receive by the end of the fundraising. |
| payments | The total number of payments. |
| timeBetweenPayments | The seconds between each payment, if payments > 1. |
#### revokeBeneficiary
Unmarks a public address as a project's beneficiary.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The supposedly contract-stored public address to revoke. |
#### modifyBeneficiaryShare
Modifies a beneficiary's share.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The involved beneficiary's public address. |
| newShare | The new share to associate to this public address. |
#### invest
Sends ethers to the escrow contract. This entrypoint needs to be called with a non-zero message value expressed in gwei.
#### withdraw
Sends back a specific amount of ethers to the message sender.
|Parameters | Description |
|:----------|:------------|
| amount | The ethers amount to withdraw from the contract. |
#### vote
Vote to say whether or not raised funds should go to the beneficiaries. Each vote is weighed according to the voter's total investment.
|Parameters | Description |
|:----------|:------------|
| choice | The vote's value. |
#### claimRefund
Sends back to the message sender his/her original investment.
#### claimShare
Sends ethers to the message sending beneficiary.
#### claimEquities
Sends escrow-specific tokens to the message sender.
#### sendEquities
Sends escrow-specific tokens to another whitelisted investor on behalf of `msg.sender`.
|Parameters | Description |
|:----------|:------------|
| recipient | A public address to send equities to. |
| equitiesToSend | The amount of equities to send to recipient. |
#### isAuthenticEscrow (view)
Returns true when this contract belongs to the factory's whitelist.
|Return | Description |
|:----------|:------------|
| isEscrow | A boolean stating whether this contract address belongs to the whitelist. |
#### isAuthenticToken (view)
Returns true when this contract belongs to the factory's whitelist.
|Return | Description |
|:----------|:------------|
| isToken | A boolean stating whether this contract address belongs to the whitelist. |
#### getTokenAddress (view)
Returns this escrow-specific token contract address.
|Return | Description |
|:----------|:------------|
| address | The token's contract address. |
#### getTotalInvestedAmount (view)
Returns the ethers amount investors sent to the contract.
|Return | Description |
|:----------|:------------|
| amount | The total invested ethers amount. |
#### getFundraiserAddress (view)
Returns the public address of the project's originator.
|Return | Description |
|:----------|:------------|
| address | The fundraiser's address. |
#### getEntryTicketValue (view)
Returns the minimum ethers value an investor can send to the contract.
|Return | Description |
|:----------|:------------|
|entryTicket | The value, expressed in Gwei, of the entry ticket. |
#### getMidCapValue (view)
Returns the fundraising financial objective.
|Return | Description |
|:----------|:------------|
|midCap | The value, expressed in Gwei, of the middle cap. |
#### getMaxEquity (view)
Returns the maximum equities an investor can get by the end of the fundraising process.
|Return | Description |
|:----------|:------------|
|maxEquity | An integer comprised within 1 and 49. |
#### getEquitiesLeft (view)
Returns the equities that are left to be shared.
|Return | Description |
|:----------|:------------|
|equitiesLeft | An integer, comprised within 0 and 100. |
#### getMaxInvestorsValue (view)
Returns the maximum number of authorized investors for this project.
|Return | Description |
|:----------|:------------|
|maxInvestors | an integer comprised within 1 and 255. |
#### getInvestorsCounterValue (view)
Returns the current number of users who invested in this project.
|Return | Description |
|:----------|:------------|
|investorsCounter | An integer comprised within 0 and maxInvestors. |
#### getCreditStatus (view)
Returns the current state of the credit's approval status.
|Return | Description |
|:----------|:------------|
| creditStatus | A string which value can either be "Unrequested", "Pending", "Granted" or "Rejected". |
#### getLeftToBeShared (view)
Returns the percentage of the raised funds that are left to be shared between the project's beneficiaries.
|Return | Description |
|:----------|:------------|
| leftToBeShared | An integer comprised within 0 and 100. |
#### getInvestorInvestedAmount (view)
Returns the invested amount of a given investor in this project.
|Parameters | Description |
|:----------|:------------|
| investor | The public address of the queried investor. |
|Return | Description |
|:----------|:------------|
|investedAmount | The value, expressed in Gwei, of the invested amount. |
#### getInvestorEquities (view)
Returns a specific investor's equities in the fundraised project.
|Parameters | Description |
|:----------|:------------|
| investor | The public address of the investor. |
|Return | Description |
|:----------|:------------|
| equities | The investor's equities. |
#### getInvestorVoteChoice (view)
Returns the vote choice of a given investor stating whether or not the fundraising should succeed.
|Parameters | Description |
|:----------|:------------|
| investor | The public address of the queried investor. |
|Return | Description |
|:----------|:------------|
| choice | The investor's vote choice, a string which can either be "Go" or "Nogo". |
#### getBeneficiaryShare (view)
Returns the share of a given beneficiary ie the percentage of the middle cap that will be sent by the end of the fundraising.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The public address of the queried beneficiary. |
|Return | Description |
|:----------|:------------|
| share | An integer, comprised within 0 and 100. |
#### getPaymentsLeft (view)
Returns the number of payments left of a specific beneficiary.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The public address of the queried beneficiary. |
|Return | Description |
|:----------|:------------|
| paymentsLeft | An integer comprised within 0 and totalPayments. |
#### getNumberOfPayments (view)
Returns the number of payments planned for a specific beneficiary.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The beneficiary's public address. |
|Return | Description |
|:----------|:------------|
| payments | An integer comprised within 1 and 255. |
#### getTimeBetweenPayments (view)
Returns the time between two payments planned for a specific beneficiary.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The beneficiary's public address. |
|Return | Description |
|:----------|:------------|
| timeBetweenPayments | A period expressed in seconds. |
#### getLockTimestamp (view)
Returns the timestamp of the time when funds have been locked in the contract.
|Return | Description |
|:----------|:------------|
| lockedTimestamp | An integer. |
#### getLockDuration (view)
Returns the maximum number of seconds funds will remain locked in the contract.
|Return | Description |
|:----------|:------------|
|lockDuration | An integer. |
#### getTimeLeft (view)
Returns the time that is left before voting is over and ballots are counted.
|Return | Description |
|:----------|:------------|
| timeLeft | The time left in seconds. |
#### getGoCounterValue (view)
Returns the number of votes advocating for funds being released in favor of beneficiaries.
|Return | Description |
|:----------|:------------|
| goCounterValue | The number of votes. |
#### getNogoCounterValue
Returns the number of votes advocating for funds being released in favor of investors.
|Return | Description |
|:----------|:------------|
| nogoCounterValue | The number of votes. |
### Events
#### FundsLocked
Emitted whenever funds are locked in the escrow contract.
#### LockDurationExtended
Emitted whenever the funds lock duration is extended.
|Parameters | Description |
|:----------|:------------|
| newLockDuration | The newly stored lock duration. |
#### BeneficiaryAdded
Emitted whenever a new beneficiary has been added by the fundraiser.
|Parameters | Description |
|:----------|:------------|
|newBeneficiary | The public address that has been added to the beneficiaries list. |
#### BeneficiaryRevoked
Emitted whenever a beneficiary has been revoked by the fundraiser.
|Parameters | Description |
|:----------|:------------|
|beneficiary | The public address that has been removed from the beneficiaries list. |
#### ShareUpdated
Emitted whenever a beneficiary's share has been updated by the fundraiser.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The public address of the involved beneficiary. |
| newShare | The new share of `beneficiary`. |
#### Invested
Emitted whenever an investor has sent funds to the contract through the invest entrypoint.
|Parameters | Description |
|:----------|:------------|
| investor | The public address of `msg.sender`. |
| amount | The `msg.value` coming with the entrypoint's call. |
#### Withdrawn
Emitted whenever an investor has withdrawn funds from the contract.
|Parameters | Description |
|:----------|:------------|
| investor | The public address of `msg.sender`. |
| amount | The quantity of Gwei the user withdraws from the contract. |
#### Voted
Emitted whenever an investor has voted in favor of the fundraising success or failure.
|Parameters | Description |
|:----------|:------------|
| investor | The public address of `msg.sender`. |
| choice | The choice of said investor, a value which can either be "Go" or "Nogo". |
#### RefundClaimed
Emitted whenever an investor claims a refund by the end of the fundraising (if unsuccessful).
|Parameters | Description |
|:----------|:------------|
| investor | The public address of `msg.sender`. |
#### EquitiesClaimed
Emitted whenever an investor claims his/her equities by the end of the fundraising (if successful).
|Parameters | Description |
|:----------|:------------|
| investor | The public address of `msg.sender`. |
#### EquitiesSent
Emitted whenever an investor send part of his/her equities to another approved investor.
|Parameters | Description |
|:----------|:------------|
| investor | The public address of `msg.sender`. |
| recipient | The public address of the equities recipient. |
| equitiesToSend | The quantity of equities to send. |
#### ShareClaimed
Emitted whenever a beneficiary claims his/her share.
|Parameters | Description |
|:----------|:------------|
| beneficiary | The public address of `msg.sender`. |
### Errors
#### ContractIsNotEscrow (contract error)
This escrow contract does not belong to the whitelisted escrow contracts list.
#### ContractIsNotToken (contract error)
This token contract does not belong to the whitelisted escrow-specific token contracts list.
#### InvalidEntryTicket (constructor error)
The provided entry ticket value either equals to zero or is higher than the max possible equity.
#### LockDurationEqualsToZero (constructor error)
Lock duration needs to be higher than zero.
#### MaxInvestorsEqualsToZero (constructor error)
The maximum number of investors needs to be higher than zero.
#### MaxInvestorsIsTooHigh (constructor error)
The maximum number of investors needs to be lower than 150.
#### MaxEquityEqualsToZero (constructor error)
The max equity investors can get needs to be higher than zero.
#### MaxEquityIsTooHigh (constructor error)
The max equity investors can get needs to be lower than 50.
#### NoFactory (constructor error)
Factory is not referenced in the contract.
#### InvalidCreditStatus (credit error)
The credit status is not set to the expected value.
#### SenderIsNotTheFundraiser (fundraiser-side error)
Only the fundraiser can perform this action.
#### InvalidLockDuration (fundraiser-side error)
The provided new lock duration is either lower or more than twice as big as the current.
#### VotesAreOpen (fundraiser-side error)
Lock duration cannot be extended since the voting period started.
#### VotesAreClosed (fundraiser-side error)
This action cannot be performed since votes are closed.
#### SenderIsNotAWhitelistedInvestor (investor-side error)
Only a whitelisted investor can perform this action.
#### SenderIsNotAProjectInvestor (investor-side error)
Only a whitelisted investor who actually invested in the project can perform this action.
#### NotEnoughBeneficiariesYet (investor-side error)
The fundraising cannot start before shares have been totally set between beneficiaries.
#### InvestmentSurpassesMaxEquity (investor-side error)
The amount sent to the contract surpasses the maximum equity an investor can get.
#### InvestmentSurpassesEquitiesLeft (investor-side error)
The amount sent to the contract surpasses the equities left to be shared between investors.
#### InvestmentIsLowerThanEntryTicket (investor-side error)
The amount sent to the contract is lower than the minimum authorized investment.
#### TransferFailed (investor-side error)
The ethers transfer failed.
#### ValueIsNotAnInteger (investor-side error)
The amount sent to the contract is not an integer.
#### GreaterThanInvestment (investor-side error)
The requested amount to withdraw is greater than the investor's original investment.
#### NoInvestors (investor-side error)
This action can be performed as long as there are project investors.
#### TooEarlyToClaimRefund (investor-side error)
This action cannot be performed yet.
#### AmountIsGreaterThanInvestorsEquities (investor-side error)
Amount to send is greater than investor's equities.
#### InvestorsEquitiesExceedsLimit (investor-side error)
Sending this amount of equities, the recipient would exceed the max allowed equities per investor.
#### TooEarlyToVote (vote-related error)
The fundraiser has not opened votes yet.
#### InvestorAlreadyVoted (vote-related error)
The investor has already voted.
#### TooLateToVote (vote-related error)
Investors cannot vote once the lock duration has expired.
#### InvalidVoteChoice (vote-related error)
Submitted vote cannot be counted.
#### TooBigOfAShare (beneficiary-side error)
A beneficiary cannot be attributed more than what is left to be shared.
#### BeneficiaryAlreadyHasAShare (beneficiary-side error)
The provided beneficiary already has a share.
#### ShareEqualsToZero (beneficiary-side error)
The beneficiary's share needs to be greater than zero.
#### InvalidNumberOfPayments (beneficiary-side error)
The provided number of payments either equals to zero or surpasses 2^8.
#### InvalidTimeBetweenPayments (beneficiary-side error)
Time between payments cannot equal to zero except in the case of a single payment.
#### NotAWhitelistedBeneficiary (beneficiary-side error)
The provided address does not belong to any whitelisted beneficiaries.
#### NotAProjectBeneficiary (beneficiary-side error)
The provided address does not belong to any mentionned project's beneficiaries.
#### AlreadyPaid (beneficiary-side error)
This beneficiary has already been paid.
#### TooEarlyToClaimShare (beneficiary-side error)
This beneficiary's time between payments has not passed.
## ERC20.sol
### Reason of being
This contract defines the shape of the tokenized shares investors receive by the end of a successful fundraising process.
### Entrypoints
#### balanceOf (view)
|Parameters | Description |
|:----------|:------------|
| \_owner | The address from which the balance will be retrieved. |
|Return | Description |
|:----------|:------------|
| balance | The balance. |
#### transfer
Sends `_value` token to `_to` from `msg.sender`.
|Parameters | Description |
|:----------|:------------|
| \_to | The address of the recipient |
| \_value | The amount of token to be transferred. |
|Return | Description |
|:----------|:------------|
|success | Whether the transfer was successful or not. |
#### transferFrom
Sends `_value` token to `_to` from `_from` on the condition it is approved by `_from`.
|Parameters | Description |
|:----------|:------------|
| \_from | The address of the sender. |
| \_to | The address of the recipient. |
| \_value | The amount of token to be transferred. |
|Return | Description |
|:----------|:------------|
| success | Whether the transfer was successful or not. |
#### approve
`msg.sender` approves `_addr` to spend `_value` tokens.
|Parameters | Description |
|:----------|:------------|
| \_spender | The address of the account able to transfer the tokens. |
| \_value | The amount of wei to be approved for transfer. |
|Return | Description |
|:----------|:------------|
| success | Whether the approval was successful or not. |
#### Allowance (view)
|Parameters | Description |
|:----------|:------------|
| \_owner | The address of the account owning tokens. |
| \_spender | The address of the account able to transfer the tokens. |
|Return | Description |
|:----------|:------------|
| remaining | Amount of remaining tokens allowed to spent. |
### Errors
#### NotOwner
`msg.sender` is not the token contract's owner.
#### NotAllowed
`msg.sender` has not been approved by the contract factory and thus cannot perform this action.
#### SenderIsNotAWhitelistedInvestor
`msg.sender` does not belong to the whitelisted investors list.
#### RecipientIsNotAWhitelistedInvestor
The recipient address does not belong to the whitelisted investors list.