# Wrap / Unwrap

### Wrapping:

### POST /v1/TokenWrapping/Request

Submit a request to wrap a token to receipt token

Note: currently we only support wrapping from USDC to USDC-G

### Request

#### Headers

| Header       | Type   | Description      |
| ------------ | ------ | ---------------- |
| Content-Type | string | application/json |

#### Request Body

| Attribute           | Type   | Description                                                                                                                                                                                                             |
| ------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SourceToken         | string | The gluwacoin token to be wrapped to TargetToken. Eg: USDC                                                                                                                                                              |
| TargetToken         | string | The gluwacoin token the user will receive after wrapping SourceToken. Eg: USDC-G                                                                                                                                        |
| Amount              | number | The amount of Source tokens to be wrapped with decimal places if any.                                                                                                                                                   |
| ApproveTxnSignature | string | <p>The raw transaction of approve function signed by the user private key to allow the TargetToken contract withdraw the Amount from SourceToken</p><p>Refer: see example Approve Raw Signature </p>                    |
| MintTxnSignature    | string | <p>The raw transaction of mint function of TargetToken contract signed by the user private key to withdraw the Amount from SourceToken and receive the TargetToken</p><p>Refer: see example Ethless Mint Signature </p> |
| Address             | string | The user’s address which has SourceToken and is used to receive TargetToken after wrapping                                                                                                                              |
| IdempotentKey       | string | ***Optional.*** The unique id generated by Gluwa SDK                                                                                                                                                                    |

#### Sample Request

```
{
  "amount": 5,
  "address": "0xf04349b4a760f5aed02131e0daa9bb99a1d1d1e5",
  "ApproveTxnSignature": "0xf8aa81b4843b9aca0083086470944dbcdf9b62e891a7cec5a2568c3f4faf9e8abe2b80b844095ea7b300000000000000000000000071b7e714f87d8b46711a2533c9783d73386b828700000000000000000000000000000000000000000000000000000000004c4b401ca028538b7cb0f280681aabc730b1ee78ddf6279246ef5a8b40e3892c05a644a6f6a00373096b304110857e64cb1e37a83213f2a73a466d72c11bdd98a984d5b523b1",
  "SourceToken": "USDC",
  "TargetToken": "USDCG",
  "MintTxnSignature": "0xf88981b5843b9aca00830864709471b7e714f87d8b46711a2533c9783d73386b828780a4a0712d6800000000000000000000000000000000000000000000000000000000004c4b401ba02cb8352f8692f45ae0fde67f85f6bd4097187a1439aca08e7e0cfc2b1c2a955da061eb5c18a9e7ce00ee2eb96584c1225b3b676507642aa51136493aaf0eda9f74", 
  "IdempotentKey": null
}
```

#### Response

| Response | 202 Accepted |
| -------- | ------------ |

**Example ApproveTxnSignature: Approve Raw Signature**

For a token owner to approve a spender to transfer(spend) an “amount“ of his/her token from a contract on his/her behalf\
Spender can be a contract address or a typical Ethereum address.

Note: the amount must include the fee, which means: approved amount = amount (to transfer) + fee

```
public static string generateApproveRawSignature(string RPC_HTTPS_Endpoint, BigInteger GasLimit, BigInteger GasPrice, string ContractAddress, string ContractABI, string ApproverPrivateKey, string SpenderAddress, BigInteger amount)
        {
            Account approverAccount = new Account(ApproverPrivateKey);
            Web3 web3 = new Web3(RPC_HTTPS_Endpoint);

            Contract contract = web3.Eth.GetContract(ContractABI, ContractAddress);

            Function contractFunction = contract.GetFunction("approve");

            TransactionInput input = contractFunction.CreateTransactionInput(approverAccount.Address,
                new HexBigInteger(GasLimit),
                new HexBigInteger(GasPrice),
                new HexBigInteger(BigInteger.Zero),
                SpenderAddress,
                amount);

            HexBigInteger txCount = web3.Eth.Transactions.GetTransactionCount.SendRequestAsync(approverAccount.Address).Result;

            string signedTxn = Web3.OfflineTransactionSigner.SignTransaction(
                ApproverPrivateKey,
                input.To,
                input.Value,
                txCount.Value,
                input.GasPrice,
                input.Gas,
                input.Data);

            Debug.Assert(Web3.OfflineTransactionSigner.VerifyTransaction(signedTxn));

            return signedTxn.EnsureHexPrefix();
        }
```

**Example MintTxnSignature: Ethless Mint Signature**

* MinterAddress: the address which will receive the minted token

Note 1: only used for wrapping USCD -> USDC-G\
Note 2: for Mint, after minting "amount" successful, the Minter need to pay "fee" from the "amount" to the Wrapper\
Note 3: the prerequisite for Mint function is that the Minter need to approve USDC-G contract to spend "amount" of USDC token on behalf of him/her

```
public static string GenerateMintSignature(string USDCG_ContractAddress, int ChainId, string MinterAddress,
            string MinterPrivateKey, BigInteger amount,
            BigInteger fee, BigInteger nonce)
        {
            ABIEncode abiEncode = new ABIEncode();
            byte[] messageHash = abiEncode.GetSha3ABIEncodedPacked(
                new ABIValue("uint8", 2),
                new ABIValue("uint256", ChainId),
                new ABIValue("address", USDCG_ContractAddress),
                new ABIValue("address", MinterAddress),
                new ABIValue("uint256", amount),
                new ABIValue("uint256", fee),
                new ABIValue("uint256", nonce)
            );
            EthereumMessageSigner signer = new EthereumMessageSigner();
            string signature = signer.Sign(messageHash, MinterPrivateKey);
            return signature;
        }
```

### Unwrapping:

### POST /v1/TokenUnwrapping/Request

Submit a request to unwrap a token to receive another token

Note: currently we only support unwrapping from USDC-G to USDC

### Request

#### Headers

| Header       | Type   | Description      |
| ------------ | ------ | ---------------- |
| Content-Type | string | application/json |

#### Request Body

| Attribute     | Type   | Description                                                                                                                                                    |
| ------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SourceToken   | string | The gluwacoin token to be unwrapped to TargetToken. Eg: USDC-G                                                                                                 |
| TargetToken   | string | The gluwacoin token the user will receive after unwrapping SourceToken. Eg: USDC                                                                               |
| Amount        | number | <p>The amount of Source tokens to be unwrapped with decimal places if any.</p><p>Note: Amount is a component to create BurnSignature</p>                       |
| BurnSignature | string | <p>The Burn signature signed by a user’s private key to authorize burning USDC-G to get USDC</p><p>Refer: see example Ethless Burn Signature</p>               |
| Nonce         | number | <p>A unique random number generated by Gluwa client</p><p>Note: Nonce is a component to create BurnSignature</p>                                               |
| Fee           | number | <p>Fee of burning retrieved from Fee API</p><p>/v1/{Currency}/fee?function=Burn</p><p>Note: Fee is a component to create BurnSignature</p>                     |
| Address       | string | <p>The user’s address which has SourceToken and is used to receive TargetToken after unwrapping</p><p>Note: Address is a component to create BurnSignature</p> |
| IdempotentKey | string | ***Optional.*** The unique id generated by Gluwa SDK                                                                                                           |

#### Sample Request

```
{
  "amount": 5,
  "address": "0xd9d097435E7CF8e663CcB26daB9C31A7F2B64ab4",
  "SourceToken": "USDCG",
  "TargetToken": "USDC",
  "BurnSignature": "0x332ebd2c7bc690984fac572d1c562beb3f86da947f0f73c59521666fe619b9d73d794897cbd7cf5abe7ebec4d68cb62b59cf8466a47fe39ec7a8c32a83090a351c",
  "Nonce": 124,
  "Fee": 1,
  "IdempotentKey": null
}
```

#### Response

| Response | 202 Accepted |
| -------- | ------------ |

**Example BurnSignature: Ethless Burn Signature**

* BurnerAddress: the address which will withdraw USDC-G token -> USDC token

Note 1: only used for unwrapping USCD-G -> USDC

Note 2: for Burn, after burning "amount" successful, the Burner need to pay "fee" from the "amount" to the Wrapper

Note 3: the prerequisite for Burn function is that the Burner need to approve USDC-G contract to spend "amount" of USDC token on behalf of him/her

```
public static string GenerateBurnSignature(string USDCG_ContractAddress, int ChainId, string BurnerAddress,
            string BurnerPrivateKey, BigInteger amount,
            BigInteger fee, BigInteger nonce)
        {
            ABIEncode abiEncode = new ABIEncode();
            byte[] messageHash = abiEncode.GetSha3ABIEncodedPacked(
                new ABIValue("uint8", 1),
                new ABIValue("uint256", ChainId),
                new ABIValue("address", USDCG_ContractAddress),
                new ABIValue("address", BurnerAddress),
                new ABIValue("uint256", amount),
                new ABIValue("uint256", fee),
                new ABIValue("uint256", nonce)
            );
            EthereumMessageSigner signer = new EthereumMessageSigner();
            string signature = signer.Sign(messageHash, BurnerPrivateKey);
            return signature;
        }
```


---

# 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.gluwa.com/api/wrap-unwrap.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.
