> For the complete documentation index, see [llms.txt](https://docs.swarmnetwork.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.swarmnetwork.org/swarm-protocol/spf/swarm-powered-fundraise-contract.md).

# Swarm Powered Fundraise Contract

* **Smart Contract:** specific to a Swarm Powered Fundraise for a specific SRC20
* **Created:** review the [SPF Deployment Sequence](https://www.swarmnetwork.org/swarm-protocol/spf#deployment-sequence); this contract references all other previously deployed contracts related to this fundraise&#x20;
* **Purpose:** Operates the actual SwarmPoweredFundraise; finalizes via stakeToMint
* **Example:**  TBD

## Feature Description

### Read Functions

| Function                                                       | Description                                                                                                                                                                                                                                   |
| -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `label()` returns `(string)`                                   | The label of the current fundraise                                                                                                                                                                                                            |
| `startDate()` returns `(uint256)`                              | Start date of the fundraise in UNIX time                                                                                                                                                                                                      |
| `endDate()` returns `(uint256)`                                | End date of the fundraise in UNIX time                                                                                                                                                                                                        |
| `minAmountBCY()` returns `(uint256)`                           | Minimum amount accepted as contribution in base currency                                                                                                                                                                                      |
| `maxAmountBCY()` returns `(uint256)`                           | Maximum amount accepted as contribution in base currency                                                                                                                                                                                      |
| `expirationTime()` returns `(uint256)`                         | Time required for the issuer to stake and mint security tokens after the fundraise has been successfully completed. If the expiration time is reached, all contributors are able to get a refund                                              |
| `src20()` returns `(address)`                                  | The SRC20 token that is being offered as a security                                                                                                                                                                                           |
| `minter()` returns `(address)`                                 | The contract that is responsible for minting the security tokens after the stake has been made                                                                                                                                                |
| `affiliateManager()` returns `(address)`                       | The contract address of the Affiliate Manager contract which is responsible for managing affiliate addresses, links and commissions                                                                                                           |
| `contributorRestrictions()` returns `(address)`                | The contract address of the Contributor Restrictions contract which is responsible for handling contributor restrictions                                                                                                                      |
| `currencyRegistry()` returns `(address)`                       | The contract address of the Currency Registry which is responsible for managing accepted currencies in the fundraise                                                                                                                          |
| `offchainContributionsAllowed()` returns `(bool)`              | Returns true if off-chain contributions are allowed. If off chain contributions are allowed the token manager can manually input contributions into the contract                                                                              |
| `softCapBCY()` returns `(uint256)`                             | The soft cap amount in base currency                                                                                                                                                                                                          |
| `hardCapBCY()` returns `(uint256)`                             | The hard cap amount in base currency                                                                                                                                                                                                          |
| `SRC20tokenPriceBCY()` returns `(uint256)`                     | The price of each SRC20 token being sold in base currency. If this is set to 0 the value will be calculated based off of tokens to mint                                                                                                       |
| `SRC20tokensToMint()` returns `(uint256)`                      | The amount of SRC20 tokens that are for sale and will be minted. It will be 0 if the fundraising is based off of a token price                                                                                                                |
| `fundraiseAmountBCY()` returns `(uint256)`                     | The amount raised in base currency                                                                                                                                                                                                            |
| `numberOfContributors()` returns `(uint256)`                   | The total number of unique addresses that have contributed to the fundraise                                                                                                                                                                   |
| `totalIssuerWithdrawalsBCY()` returns `(uint256)`              | The total amount the issuer can withdraw in base currency                                                                                                                                                                                     |
| `issuerWallet()` returns `(address)`                           | Returns the address of the wallet which will receive the raised funds                                                                                                                                                                         |
| `isFinished()` returns `(bool)`                                | Returns true if the fundraising has been cancelled or successfully finished<                                                                                                                                                                  |
| `setupCompleted()` returns `(bool)`                            | Returns true if the fundraising set up is complete                                                                                                                                                                                            |
| `contributionsLocked()` returns `(bool)`                       | Returns true if contributions are locked. This means contributors are not able to obtain a refund                                                                                                                                             |
| `contributionsList[address]` returns `(array)`                 | Each contributor address holds an array of a Contribution structure like this `struct Contribution {address currency;uint256 amount;uint256 sequence;ContributionStatus status;}`                                                             |
| `bufferedContributions[address][address]` returns `(uint256)`  | These are contributions that have yet to be counted as valid; the first parameter is the contributor and the second is the currency address in this format `bufferedContributions[contributor_address][currency_address]= amount contributed` |
| `bufferedSums[address]` returns `(uint256)`                    | Total sum of pending contributions per currency address                                                                                                                                                                                       |
| `qualifiedContributions[address][address]` returns `(uint256)` | These are contributions that have been qualified and count in the fundraise. The first parameter is the contributor and the second is the currency address                                                                                    |
| `qualifiedSums[address]` returns `(uint256)`                   | Total sum of qualified contributions per currency address                                                                                                                                                                                     |
| `historicalBalance[address]` returns `(array)`                 | An array of Balance structures per currency address. `struct Balance {uint256 sequence;uint256 balance;}`                                                                                                                                     |

### Write Functions

| Function                                                              | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `setupContract(uint256, uint256, address, address, bool)`             | This function finishes setting up the contract once it has been deployed. The parameters are the following: 1/ Minimum contribution amount accepted in base currency; 2/ Maximum contribution amount accepted in base currency; 3/ Affiliate Manager contract address; 4/ Contributor Restrictions contract address; 5/ A boolean that sets if the contributions are locked                                                                                                                                                                                                                 |
| `cancelFundraise() returns (bool)`                                    | It cancels the fundraise; this function can only be called by the contract owner (token issuer)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `getContributionsBCY(address, bool)` returns `(uint256)`              | Returns the contributor’s sum of contributions in base currency; the contributor’s address is the first parameter and the second parameter is a boolean for qualified contributions (*true*) or pending contributions (*false*)                                                                                                                                                                                                                                                                                                                                                             |
| `addOffchainContribution(address, address, uint256)` returns `(bool)` | If off-chain contributions are allowed the token issuer can add contributions manually so the contract can later mint and distribute tokens for manual contributions; this feature requires trust on the part of the token issuer                                                                                                                                                                                                                                                                                                                                                           |
| `contribute(address, uint256, string)` returns `(bool)`               | Allow contributions of ERC20 tokens that are registered in the `Currency Registry` contract. The first parameter is the address of the ERC20, the second is the amount in Wei and the third is the affiliate link if there is one; e.g. to contribute 100 DAI with affiliate link name affiliate use `contribute("0x6b175474e89094c44da98b954eedeac495271d0f",100000000000000000000,"affiliate")`                                                                                                                                                                                           |
| `getRefund()` returns `(bool)`                                        | Allow a user to get ERC20 and ETH refunds if the fundraise has passed expiration time or has been cancelled                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `acceptContributor(address)` returns `(bool)`                         | Function that can only be called by the Contributor Restriction smart contract after a user has been whitelisted by the issuer                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| `removeContributor(address)` returns `(bool)`                         | Function that can only be called by the Contributor Restriction smart contract after a user's address has been unwhitelisted by the token issuer                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `stakeAndMint(address, uint256)` returns `(bool)`                     | Allow token issuer to stake SWM tokens in order to mint SRC20 tokens. The token issuer can either use `ISOP` or stake directly if they have the required SWM. The `stakeAndMint()` function will also conclude the fundraise by internally calling the function `finishFundraise()`. When `stakeAndMint()` finalizes the fundraise, that the people whitelisted for a fundraise are automatically added to the SRC20 Transfer Rules via `bulkWhitelistAccount()`. Otherwise `stakeAndMint()` could run into problems because the holders are not able to hold the newly minted SRC20 tokens |
| `claimTokens()` returns `(uint256)`                                   | Allow contributors to claim their portion of SRC20 tokens after the fundraising is successfully over                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.swarmnetwork.org/swarm-protocol/spf/swarm-powered-fundraise-contract.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
