npm package: @floki-inu/contracts
Description: We use hardhat for local development.
Latest version: 1.30.1

# FlokiFi-contracts

We use hardhat for local development.

For deployment and contract verification, we use [hardhat-deploy](https://github.com/wighawag/hardhat-deploy).

The relevant folders are:

- contracts: for all our smart contracts.
- deploy: contains scripts for deploying smart contracts.
- deployments: contains the artifacts of deployed smart contracts.
- src: contains typescript types for our smart contracts.
- test: contains our tests, which run against mainnet forks.

There is a file `src/config.ts` which contains config for all the networks we support, for all projects (e.g. Locker, Staking, Token Launcher).

This file should not have sensitive data, as this is committed to git. Any setup required for deployment or testing that may change between one network and another should be in this file.

## Deploy the contracts

There is a `.env.example` file. Duplicate it and rename it to `.env`, this file is in gitignore and should never be committed.

For deploying, it requires three variables:

- DEPLOYER_ADDRESS: The wallet address used for deploying contracts. This is for all chains.
- REMOTE_SIGNER_HOST: The host of the Floki Signer App, used for remotely signing transactions.
- SIGNER_TOKEN: An AWS Cognito access token for authenticating with the Signer App.

You can ask another dev for the first two. The third one we'll see soon.

We do not keep private keys locally as it's not safe. So we extend hardhat using a custom provider which sends transactions to the signer app, which runs in an isolated environment without internet access within our cluster.

### AWS Cognito Setup

The Signer App requires authentication. First, you need to create a user on AWS Cognito.

Go to our [Sign Up page](https://flokifi.auth.us-east-1.amazoncognito.com/signup?client_id=vij0ca2mbni6mjst8apdvgko1&response_type=code&scope=email+openid&redirect_uri=https%3A%2F%2Fflokifi.com) and register. If it shows an error message after you register, you can ignore.

Ask an AWS admin to approve your Cognito account.

Once approved, you can login through the [Sign In page](https://flokifi.auth.us-east-1.amazoncognito.com/login?client_id=vij0ca2mbni6mjst8apdvgko1&response_type=code&scope=email+openid&redirect_uri=https%3A%2F%2Fflokifi.com).

You'll be required to setup MFA. You can use Authy, Google Authenticator or some other TOTP app on your smartphone (or some other device).

Scan the QR Code on the app, provide the code generated by the app, and give your device a name (e.g. My Smartphone). If the login succeeds, you should be redirected to flokifi.com.

### Generate Tokens

With your login working and MFA enabled, you can now generate tokens for deploying contracts.

You need [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) installed.

We have a bash script `.auth.sh` to make it easier generating tokens. You can use it like this:

```
yarn auth
```

The script will prompt you for your Cognito Username, Password, and the MFA Code which you can get from the TOTP app you used (e.g. Authy).

This script will update the `SIGNER_TOKEN` key from the `.env` file with an access token from Cognito, which is valid for 1 hour.

Now you can proceed to deploying with hardhat.

### Deploy commands

```
yarn hardhat deploy --network goerli --tags Locker
yarn hardhat deploy --network goerli --tags Staking
yarn hardhat deploy --network goerli --tags TokenLauncher
```

### NPM Package

We have a github action that exports the ABIs and Bytecode as an npm package, so it can be easily used in all projects.

## Verify the contracts

```
yarn hardhat etherscan-verify --network goerli
```

## Run the tests

```
yarn test:locker
yarn test:staking
yarn test:token-launcher
```

## Creating Diamond Implementation contract

### Facets Names

Add the names of your facets to the `facetsNames` variable in the `generateImplementation.ts` file.

Run the following command:

```
yarn hardhat deploy --network goerli --tags DiamondImplementation
```