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

Request Body

Sample Request

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

Response

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

Request Body

Sample Request

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

Response

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;
        }

Last updated