# Activation

## Overview

The launch of a CityCoin happens in a three-step process:

1. The contract for a CityCoin is deployed mainnet on the Stacks blockchain
2. The auth contract is initialized (a one-time function to set everything up)
3. 20 unique wallets send a transaction to the contract signaling activation

Once the threshold is met, a 150 block (\~24hr) countdown begins after which anyone is eligible to try and mine the CityCoins within a given Stacks block.

There are no CityCoins issued or distributed prior to the start of mining.

## Details

Registration happens by calling the [`register-user`](#register-user) function in the CityCoin contract, which can be done with the [Stacks Web Wallet](https://hiro.so/wallet/install-web) through an interface like [minecitycoins.com](https://minecitycoins.com).

{% hint style="info" %}
An example of the code used in the CityCoins UI can be found in the [RegisterUser component](https://github.com/citycoins/citycoin-ui/blob/main/src/components/activation/RegisterUser.js) on GitHub.
{% endhint %}

A nominal transaction fee is required in order to send this transaction, paid in STX, and you can optionally include a memo of up to 50 characters that will be recorded on-chain.

Once the threshold is reached, the `register-user` function will:

* calculate the activation block height + the activation delay
* set the `core` as active in the core contract map in `auth`
* set the `token` as active and set the coinbase amounts and coinbase thresholds

  (based on the activation block height)
* set the coinbase amounts and thresholds in `core` to match that of `token`

## Functions

### [API Ref: Activation](https://api.citycoins.co/docs#tag/Activation)

### get-activation-block

Type: Read-only Function

Success: `(ok (var-get activationBlock)) returned as a uint`

Error: `ERR_CONTRACT_NOT_ACTIVATED u1005`

Returns the Stacks block height at which the city was activated, or an error if not.

### get-activation-delay

Type: Read-only Function

Returns: `(var-get activation-delay) as a uint`

Returns the activation delay for mining and stacking to become available.

### get-activation-status

Type: Read-only Function

Returns: `(var-get activationReached) as a boolean`

Returns the activation status of the contract.

get-activation-target

Type: Read-only Function

Returns: `(var-get activationTarget) as a uint`

Returns the activation target of the contract, which is the block mining and stacking will become available.

### get-activation-threshold

Type: Read-only Function

Returns: `(var-get activationThreshold) as uint`

Returns the number of users required to register for activation of the contract.

### get-registered-users-nonce

Type: Read-only Function

Returns: `(var-get usersNonce) as uint`

Returns the total number of registered users in the contract, including those registered after activation occurs.

### get-user-id

Type: Read-only Function

Input: `user as principal`

Returns: `(some uint) OR (none)`

Returns the user ID of a given principal.

### get-user

Type: Read-only Function

Input: `userId as uint`

Returns: `(some principal) OR (none)`

Returns the principal of a given user ID.

### register-user

Type: Public Function

Inputs: `optional memo as string-utf8, length 50`

Success: `(ok true)`&#x20;

Errors:

* `ERR_USER_ALREADY_REGISTERED u1001`
* `ERR_ACTIVATION_THRESHOLD_REACHED u1004`

Registration occurs through calling the `register-user` function in the contract, which optionally accepts up to 50 characters as a memo to record on-chain.


---

# Agent Instructions: 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:

```
GET https://docs.citycoins.co/contract-functions/activation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
