Asset transfers

Asset transfers

A user might want to transfer their asset from one wallet to another for various reasons, ie. sending the asset as a gift.

📝GUIDES

  • Core SDK

  • Link SDK

Core SDK

1. Initialize the Core SDK

In order to use the Core SDK, you need to initialize it.

2. Generate signers

Transferring an asset requires a user's signature, so your application will need to generate signers.

3. Set the transfer params

The transfer request requires:

  1. ETH and Stark signers (see previous step)

  2. Token type, and token amount/details to be transferred

  3. Address of receiving account

Token types that can be transferred and details required:

  • ETH - amount

  • ERC20 - amount, tokenAddress

  • ERC721 - tokenAddress, tokenId

Param
Description

amount

The amount of the token required. If token is ETH, the amount is denominated in wei

tokenAddress

The address of the smart contract from which the token originates

tokenId

The token ID of a non-fungible token (only for ERC721 token types)

  • Typescript Core SDK

📚SDK REFERENCE

  • unsignedTransferRequest

Example request params for the different token types:

ETH

const unsignedTransferRequest = {
  type: 'ETH',
  amount: '100000000', // Denominated in wei
  receiver: "RECEIVER'S ETH ADDRESS",
};

ERC20

const unsignedTransferRequest = {
  type: "ERC20",
  amount: "100000000",
  tokenAddress: '0x...'
  receiver: "RECEIVER'S ETH ADDRESS",
}

ERC721

const unsignedTransferRequest = {
  type: 'ERC721',
  tokenId: '1',
  tokenAddress: '0x...',
  receiver: "RECEIVER'S ETH ADDRESS",
};

  • Kotlin (JVM) Core SDK

📚SDK REFERENCE

  • AssetModel

    • Erc20Asset

    • Erc721Asset

    • EthAsset

Example request params for the different token types:

ETH

val token = EthAsset(
  quantity = "100000000"
)

ERC20

val token = Erc20Asset(
  tokenAddress = "0x...",
  decimals = 18,
  quantity = "100000000"
)

ERC721

val token = Erc721Asset(
  tokenAddress = "0x...",
  tokenId: "1"
)

  • Swift Core SDK

📚SDK REFERENCE

  • createTransferRequest

  • Golang Core SDK

📚SDK REFERENCE

  • GetSignableTransferRequestV1

  • Token type models:

    • SignableETHToken

    • SignableERC20Token

    • SignableERC721Token

import (
  "github.com/XpansionChain/imx-core-sdk-golang/imx"
  "github.com/XpansionChain/imx-core-sdk-golang/tokens"
  "github.com/XpansionChain/imx-core-sdk-golang/examples/workflows/utils"
)

var l1signer imx.L1Signer

// ETH token
transferRequest := api.GetSignableTransferRequestV1{
  Token: *tokens.SignableETHToken(),
  // Amount to be transferred, denominated in wei
  Amount: "100000000",
  // Sender's ETH address
  Sender: l1signer.GetAddress(),
  // Receiver's ETH address
  Receiver: "UPDATE WITH RECEIVER'S ETH ADDRESS",
}

// ERC20 token
transferRequest := api.GetSignableTransferRequestV1{
  // Pass in decimals and token address
  Token: *tokens.SignableERC20Token(18, "0x..."),
  Amount: "100000000",
  Sender: l1signer.GetAddress(),
  Receiver: "UPDATE WITH RECEIVER'S ETH ADDRESS",
}

// ERC721 token
transferRequest := api.GetSignableTransferRequestV1{
  // Pass in token address and token ID
  Token: *tokens.SignableERC721Token("0x...", "1"),
  Sender: l1signer.GetAddress(),
  Receiver: "UPDATE WITH RECEIVER'S ETH ADDRESS",
}

See also:

💻EXAMPLE

  • Transfer

4. Create the transfer

  • Typescript Core SDK

📚SDK REFERENCE

  • transfer

const walletConnection = { ethSigner, starkSigner };

// Transfers the asset
const response = await client.transfer(
  walletConnection,
  unsignedTransferRequest
);

// Print out the response
console.log(response);

Example response:

interface CreateTransferResponseV1 {
  /**
   * [deprecated] Sent signature
   * @type {string}
   */
  sent_signature: string;
  /**
   * [deprecated] The status of transfer
   * @type {string}
   */
  status: string;
  /**
   * [deprecated] Time of the transfer
   * @type {number}
   */
  time: number;
  /**
   * ID of the transfer
   * @type {number}
   */
  transfer_id: number;
}

  • Kotlin (JVM) Core SDK

📚SDK REFERENCE

  • transfer

import com.XpansionChain.sdk.XpansionChainCore.transfer
import com.XpansionChain.sdk.Signer
import com.XpansionChain.sdk.StandardStarkSigner
import com.XpansionChain.sdk.model.Erc20Asset
import jdk.jpackage.internal.Log
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.future.await
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

fun main(): Unit = runBlocking {
    launch(Dispatchers.Default) {
        val signer : Signer
        val starkSigner : StandardStarkSigner

        try {
            // Token to be transferred
            val token = Erc20Asset(
                tokenAddress = "0x...",
                decimals = 18,
                quantity = "100000000"
            )

            // Executes the transfer workflow
            val createTransferResponse = transfer(
                token = token,
                recipientAddress = "UPDATE WITH RECEIVER'S ETH ADDRESS",
                signer = signer,
                starkSigner = starkSigner
            ).await()

            // Prints the response
            Log.verbose(createTransferResponse.toString())
        } catch (e: Exception) {
            throw e
        }
    }
}

Example response:

data class CreateTransferResponse (
    /* List of transfer IDs */
    @Json(name = "transfer_ids")
    val transferIds: kotlin.collections.List<kotlin.Int>
)

  • Swift Core SDK

📚SDK REFERENCE

  • createTransfer

  • Golang Core SDK

📚SDK REFERENCE

  • Transfer

// Transfer asset workflow example
package transferexample

import (
  "context"
  "log"

  "github.com/XpansionChain/imx-core-sdk-golang/generated/api"
  "github.com/XpansionChain/imx-core-sdk-golang/imx"
  transfersWorkflow "github.com/XpansionChain/imx-core-sdk-golang/workflows/transfers"
)

func main() {
  var ctx context.Context
  var apiClient imx.Client
  var l1signer imx.L1Signer
  var l2signer imx.l2signer
  var transferRequest api.GetSignableTransferRequestV1

  // Executes the transfer workflow
  response, err := transfersWorkflow.CreateTransfer(ctx, apiClient, l1signer, l2signer, transferRequest)
  if err != nil {
    log.Panicf("error in executing the transfer workflow: %v\n", err)
  }

  // Prints out the response
  log.Printf("Response: %v", response)
}

Example response:

type CreateTransferResponseV1 struct {
  // [deprecated] Sent signature
  SentSignature string `json:"sent_signature"`
  // [deprecated] The status of transfer
  Status string `json:"status"`
  // [deprecated] Time of the transfer
  Time int32 `json:"time"`
  // ID of the transfer
  TransferId int32 `json:"transfer_id"`
}

See also:

💻EXAMPLE

  • Transfer

Last updated