# Subscription Contracts

***Subscription Contracts*** is the main contract that allow providers users to interact with the providers created app.

## **View Methods**

### isMySubscriber

```solidity
function isMySubscriber(
      uint256 _appId,
      address _user
)
```

Returns  user subscription information for check if a specific address is a user of specific app.&#x20;

Return values :

<table><thead><tr><th width="266">Types</th><th width="228.33333333333331">Description</th><th>Description</th></tr></thead><tbody><tr><td>isSubscriber</td><td><pre class="language-solidity"><code class="lang-solidity">bool
</code></pre></td><td>True if user is a current subscriber of the app, false if not.</td></tr><tr><td>isTrialSubscriber</td><td><pre class="language-solidity"><code class="lang-solidity">bool
</code></pre></td><td>True if user is a trial subscriber of the app, false if not</td></tr><tr><td>paymentId</td><td><pre class="language-solidity"><code class="lang-solidity">bytes32
</code></pre></td><td>The id of the payment that is used in the subscription</td></tr><tr><td>subscriptionId</td><td><pre class="language-solidity"><code class="lang-solidity">bytes32
</code></pre></td><td>The subscription id</td></tr></tbody></table>

### paymentDue

```solidity
function paymentDue(bytes32 _subscriptionId)
```

Returns `subscription status`

Return values :

<table><thead><tr><th>Name</th><th>Types</th><th>Description</th></tr></thead><tbody><tr><td>isDue</td><td><pre class="language-solidity"><code class="lang-solidity">bool
</code></pre></td><td>True, if it is the time for user to pay, false if not.</td></tr><tr><td>isOver</td><td><pre class="language-solidity"><code class="lang-solidity">bool
</code></pre></td><td>True if the user has not paid and the subscription must be stopped.</td></tr></tbody></table>

## **Write Methods**

### createSubscription

```solidity
function createSubscription(
        uint256 _appId,
        bytes32 _paymentId,
        address _token,
        uint256 _userChoosenPeriod
)
```

Subscribe to an app

### cancelSubscription

```solidity
function cancelSubscription(
        bytes32 _subscriptionId,
        uint256 _appId
)
```

Stop subscription

### processSubscription

```solidity
function processSubscription(bytes32 _subscriptionId)
```

Restart subscription if stopped.

### renewSubscription

```solidity
function renewSubscription(bytes32 _subscriptionId)
```

Renewal of the subscription if it has expired.

### migrateToNewPayment

```solidity
function migrateToNewPayment(
        bytes32 _subscriptionId,
        bytes32 _newPayment,
        address _token
)
```

Migrate existing subscripiton to a new payment

### refundSubscription

```solidity
function refundSubscription(bytes32 _subscriptionId)
```

Pay subscription all at once

## **Events & ABI**

<pre class="language-solidity"><code class="lang-solidity">event NewSubscription(
    address subscriber,
    uint256 indexed appId,
    bytes32 subscriptionId
)

event TrialSubscription(
    address subscriber,
    uint256 indexed appId,
    bytes32 subscriptionId
);

event SubscriptionCancelled(
    address subscriber,
    uint256 indexed appId,
    bytes32 subscriptionId
);

<strong>event SubscriptionProcessed(
</strong>    address subscriber,
    uint indexed appId,
    bytes32 subscriptionId
);

event RefundSubscription(
    address subscriber,
    uint256 indexed appId,
    bytes32 subscriptionId
);

event RenewSubscription(
    address subscriber,
    uint256 indexed appId,
    bytes32 subscriptionId
);
</code></pre>

```json
[
    {
        "name": "NewSubscription",
        "type": "event",
        "anonymous": false,
        "inputs": [
            {
                "type": "address",
                "name": "subscriber",
                "indexed": false
            },
            {
                "type": "uint256",
                "name": "appId",
                "indexed": true
            },
            {
                "type": "bytes32",
                "name": "subscriptionId",
                "indexed": false
            }
        ]
    }
]
```


---

# 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.subsprotocol.com/developer-docs/subscription-contracts.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.
