> ## Documentation Index
> Fetch the complete documentation index at: https://docs.magic.link/llms.txt
> Use this file to discover all available pages before exploring further.

# Zilliqa

## Installation

Magic interacts with the [Zilliqa](https://www.zilliqa.com/) blockchain via Magic's extension NPM package [`@magic-ext/zilliqa`](https://www.npmjs.com/package/@magic-ext/zilliqa). The Zilliqa extension also lets you interact with the blockchain using methods from [Zilliqa's JavaScript SDK](https://github.com/Zilliqa/Zilliqa-JavaScript-Library).

<Note>
  **NOTE**

  You can skip straight to our kitchen sink example directly:

  [**Zilliqa Example**](https://codesandbox.io/s/github/MagicLabs/example-zilliqa)
</Note>

<CodeGroup>
  ```bash NPM icon="npm" theme={null}
  npm install --save @magic-ext/zilliqa
  ```

  ```bash Yarn icon="yarn" theme={null}
  yarn add @magic-ext/zilliqa
  ```
</CodeGroup>

## Initialization

```js JavaScript icon="square-js" theme={null}
import { Magic } from 'magic-sdk';
import { ZilliqaExtension } from '@magic-ext/zilliqa';

const magic = new Magic('YOUR_API_KEY', {
  extensions: [
    new ZilliqaExtension({
      rpcUrl: 'Zilliqa_RPC_NODE_URL',
    }),
  ],
});
```

### CDN

```javascript JavaScript icon="square-js" theme={null}
<script src="https://auth.magic.link/sdk"></script>
<script type="text/javascript" src="https://auth.magic.link/sdk/extension/zilliqa"></script>

<script>
  const magic = new window.Magic("YOUR_API_KEY", {
      extensions: [
        new MagicZilliqaExtension({
          rpcUrl: 'ZILLIQA_RPC_NODE_URL'
        })
      ]
  });
</script>
```

## Common Methods

**Getting Test ZIL**

Before you can send transaction on the Zilliqa blockchain, you'll need to acquire some test ZIL (Zilliqa's native cryptocurrency for test network).

1. Go to our [**Zilliqa Example**](https://codesandbox.io/s/github/MagicLabs/example-zilliqa) application
2. Login with your email address
3. Copy your **Zilliqa** public address
4. Go to the [**ZIL Faucet**](https://dev-wallet.zilliqa.com/faucet)
5. Paste your copied Zilliqa public address in the text input
6. You can receive **300 test ZIL**
7. Now you can use your test ZIL in our [**example app**](https://codesandbox.io/s/github/MagicLabs/example-zilliqa)

### Get User Wallet

Using `getWallet` function to get a Zilliqa wallet for the current user.

```js JavaScript icon="square-js" theme={null}
import { Magic } from 'magic-sdk';
import { ZilliqaExtension } from '@magic-ext/zilliqa';

const magic = new Magic('YOUR_API_KEY', {
  extensions: [
    new ZilliqaExtension({
      rpcUrl: 'Zilliqa_RPC_NODE_URL',
    }),
  ],
});

// Get user's Zilliqa wallet info
const wallet = await magic.zilliqa.getWallet();
console.log('Zilliqa wallet: ', wallet);
```

### Send Transaction

To send a standard Zilliqa blockchain transaction, you can call the `magic.Zilliqa.sendTransaction` method.

```js JavaScript icon="square-js" theme={null}
import { Magic } from 'magic-sdk';
import { ZilliqaExtension } from '@magic-ext/zilliqa';
const { BN, Long, bytes, units } = require('@zilliqa-js/util');

const magic = new Magic('YOUR_API_KEY', {
  extensions: [
    new ZilliqaExtension({
      rpcUrl: 'Zilliqa_RPC_NODE_URL',
    }),
  ],
});

const chainId = 333; // chainId of the developer testnet
const msgVersion = 1; // current msgVersion
const VERSION = bytes.pack(chainId, msgVersion);

const myGasPrice = units.toQa('1000', units.Units.Li);

const params = {
  version: VERSION,
  toAddr: 'zil14vut0rh7q78ydc0g7yt7e5zkfyrmmps00lk6r7',
  amount: new BN(units.toQa('0.5', units.Units.Zil)),
  gasPrice: myGasPrice,
  gasLimit: Long.fromNumber(1),
};

const tx = await magic.zil.sendTransaction(params, false);
// Send a transaction
console.log('send transaction', tx);
```

## Smart Contract

### Deploy Contract

To deploy a smart contract, you can call the `magic.zilliqa.deployContract` method.

```js JavaScript icon="square-js" theme={null}
import { Magic } from 'magic-sdk';
import { ZilliqaExtension } from '@magic-ext/zilliqa';
const { BN, Long, bytes, units } = require('@zilliqa-js/util');

const magic = new Magic('YOUR_API_KEY', {
  extensions: [
    new ZilliqaExtension({
      rpcUrl: 'Zilliqa_RPC_NODE_URL',
    }),
  ],
});

const wallet = await magic.zilliqa.getWallet();

const address = wallet.address;

const code = `scilla_version 0

    (* HelloWorld contract *)

    import ListUtils

    (***************************************************)
    (*               Associated library                *)
    (***************************************************)
    library HelloWorld

    let not_owner_code = Int32 1
    let set_hello_code = Int32 2

    (***************************************************)
    (*             The contract definition             *)
    (***************************************************)

    contract HelloWorld
    (owner: ByStr20)

    field welcome_msg : String = ""

    transition setHello (msg : String)
      is_owner = builtin eq owner _sender;
      match is_owner with
      | False =>
        e = {_eventname : "setHello()"; code : not_owner_code};
        event e
      | True =>
        welcome_msg := msg;
        e = {_eventname : "setHello()"; code : set_hello_code};
        event e
      end
    end


    transition getHello ()
        r <- welcome_msg;
        e = {_eventname: "getHello()"; msg: r};
        event e
    end`;

const init = [
  // this parameter is mandatory for all init arrays
  {
    vname: '_scilla_version',
    type: 'Uint32',
    value: '0',
  },
  {
    vname: 'owner',
    type: 'ByStr20',
    value: `${address}`,
  },
];

const chainId = 333; // chainId of the developer testnet
const msgVersion = 1; // current msgVersion
const VERSION = bytes.pack(chainId, msgVersion);

const myGasPrice = units.toQa('1000', units.Units.Li);

const params = {
  version: VERSION,
  gasPrice: myGasPrice,
  gasLimit: Long.fromNumber(10000),
};

const result = await magic.zil.deployContract(init, code, params, 33, 1000, false);

console.log('deploy contract', result);
```

## Resources

* [Zilliqa Block Explorer](https://viewblock.io/zilliqa)
