# Meta-Contract SDK

This sdk helps you to interact with [MVC meta contracts][mvc]

Please read the [documentation][docs] for more.

## How to install

npm install meta-contract --save

## How to use(FT)

### Init

```js
const { FT } = require('meta-contract')

const { signers, signerSelecteds } = await FT.selectSigners()
const ft = new FT({
  network: 'testnet', //mainnet or testnet
  purse: '', //the wif of a mvc address to offer transaction fees
  feeb: 0.5,
  signers,
  signerSelecteds,
})
```

### Genesis

Define a token with name,symbol,decimal number.
You should save the returned values.(genesis、codehash、sensibleId)

```js
let { txid, genesis, codehash, sensibleId } = await ft.genesis({
  genesisWif: CoffeeShop.wif,
  tokenName: 'COFFEE COIN',
  tokenSymbol: 'CC',
  decimalNum: 3,
})
```

### Issue

Issue 1000000000000 tokens

```js
let { txid } = await ft.issue({
  genesis: genesis,
  codehash: codehash,
  sensibleId: sensibleId,
  genesisWif: CoffeeShop.wif,
  receiverAddress: CoffeeShop.address,
  tokenAmount: '1000000000000',
  allowIncreaseIssues: false, //if true then you can issue again
})
```

### Transfer

Transfer from CoffeShop to Alice and Bob

```js
let { txid } = await ft.transfer({
  senderWif: CoffeeShop.wif,
  receivers: [
    {
      address: Alice.address,
      amount: '5000000',
    },
    {
      address: Bob.address,
      amount: '5000000',
    },
  ],
  codehash: codehash,
  genesis: genesis,
})
```

### Query Balance

Query token's balance

```js
let { balance, pendingBalance, utxoCount, decimal } = await ft.getBalanceDetail({
  codehash,
  genesis,
  address: Alice.address,
})
```

## How to use(NFT)

### Init

```ts
import {API_NET, API_TARGET, mvc, NftManager} from "meta-contract"


// Generate new seed , need to memorize this mnemonic or use your own
// let mnemonic = mvc.Mnemonic.fromString(cute siren parrot merit swamp plate federal buddy sing tourist family tragic)
let mnemonic = mvc.Mnemonic.fromRandom()
console.log(mnemonic.toString())
let hdPrivateKey = mnemonic.toHDPrivateKey("", "testnet").deriveChild("m/44'/0'/0'");
console.log(hdPrivateKey.publicKey.toAddress("testnet").toString())
console.log(mnemonic.toHDPrivateKey("", "testnet").deriveChild("m/44'/0'/0'").privateKey.toString());
// use this private key to sign txs later
const privKey = mnemonic.toHDPrivateKey("", "testnet").deriveChild("m/44'/0'/0'").privateKey.toString()
const nftManager = new NftManager({apiTarget: API_TARGET.MVC, network: API_NET.TEST, purse: privKey});
// todo remove authorize in the future
nftManager.api.authorize({authorization: "METASV_KEY"})

```

### Genesis

Define the NFT with totalSupply
You should save the returned values.(genesis、codehash、sensibleId)

```ts
const result = await nftManager.genesis({totalSupply: "10"})
console.log(result)
```

### Mint

Mint a NFT to CoffeeShop's address
metaTxId is created by metaid which stands for NFT State

```js
// todo generate metaId tx before mint
const mintResult = await nftManager.mint({
    metaOutputIndex: 0,
    metaTxId: "0000000000000000000000000000000000000000000000000000000000000000",
    sensibleId: result.sensibleID
});
console.log(mintResult)
```

### Transfer

Transfer #1 NFT from CoffeShop to Alice

```ts
const result = await nftManager.transfer({
    codehash: "48d6118692b459fabfc2910105f38dda0645fb57",
    genesis: "4920af2eb18493255e662b07d1d80610de7cb2e3",
    receiverAddress: "mymqKrpZjY31ABhPXfXjfVcUd78L1LCHEv",
    senderWif: privKey,
    tokenIndex: "1"
});
console.log(result)
```

### Sell

Sell #1 NFT

```js
let { sellTx, tx } = await nft.sell({
  codehash,
  genesis,
  sellerWif: Alice.wif,
  tokenIndex: '1',
  satoshisPrice: 2000,
})
```

### Cancel Sell

Cancel Sell #1 NFT

```js
let { unlockCheckTx, tx } = await nft.cancelSell({
  codehash,
  genesis,
  tokenIndex: '1',
  sellerWif: Alice.wif,
})
```

### Buy

Buy #1 NFT

```js
let { unlockCheckTx, tx } = await nft.buy({
  codehash,
  genesis,
  tokenIndex: '1',
  buyerWif: Bob.wif,
})
```

## Example

<a href="http://gitlab2.showpay.top/front-end/meta-contract/-/tree/master/examples">Go to examples</a>

[docs]: ''
[mvc]: ''
