# Writing a Wrapper

The first step to adding functionality to your new wrapper is to update the mutation schema by defining the methods you'd like users to query in GraphQL.&#x20;

Here's an example of method and custom data types of our Tezos Domains wrapper that are added in your `./src/mutation/schema.graphql` schema file:

```graphql
type Mutation {
 ...

type CommitParams {
  label: String!
  owner: String!
  nonce: UInt32!
}

type BuyParams {
  label: String!
  owner: String!
  address: String!
  nonce: UInt32!
  duration: UInt32!
  data: String!
}

type SendParams {
  amount: UInt32
  source: String
  fee: UInt32
  gasLimit: UInt32
  storageLimit: UInt32
  mutez: Boolean
}

type Mutation {
  commit (
    network: Network!
    params: CommitParams!
    sendParams: SendParams
    custom: CustomConnection
  ): String!

  buy (
    network: Network!
    params: BuyParams!
    sendParams: SendParams
    custom: CustomConnection
  ): String!
}
```

### Import New Types

In your `src/mutation/index.ts` file, import the new types that you defined:

```typescript
import {
 Input_commit,
 Tezos_Mutation,
 Input_buy,
 TezosDomainsPlugin_Query,
} from "./w3"

# Importing codes that can be used in both queries and mutations 
import { getConnection, getSendParams } from "../common/utils";

# Importing a query function into mutation
import { encodeCommitment } from "../query";
```

Although these new types will not yet exist, they'll be generated in the `./src/mutation/w3/*` folder after building via yarn.

### Implement Mutation Method

Now you can implement the mutation method by adding the function to the bottom of your `./src/mutation/index.ts` file. Example:

```typescript
export function buy(input: Input_buy): string {
 const label = TezosDomainsPlugin_Query.char2Bytes({
   text: input.params.label
 });
 const address = getConnection(input.network, "Buy", input.custom);
 const hash = Tezos_Mutation.walletContractCallMethod({
   address: address.contractAddress,
   method: "buy",
   args: '["' +
     label + '", "' +
     input.params.duration.toString() + '", "' + 
     input.params.owner + '", "' +
     input.params.address + '", ' +
     input.params.data + ', "' +
     input.params.nonce.toString() +
   '"]',
   params: getSendParams(input.sendParams, address.contractAddress),
   connection: address.connection
 })
 return hash;
}
```
