Skip to main content

Send native transfer

Send ETH or native tokens on EVM chains:
var tx = new Dictionary<string, object>
{
    { "to", "0xRecipientAddress" },
    { "from", wallet.Address },
    { "value", "0x" + ((long)(0.01 * 1e18)).ToString("X") } // 0.01 ETH in wei
};

string txHash = await DynamicSDK.Instance.Networks.Evm.SendTransaction(
    wallet.Address, tx);

Debug.Log($"Transaction hash: {txHash}");

Write contract

Interact with smart contracts:
var abiJson = @"[{
    ""inputs"": [
        {""name"": ""to"", ""type"": ""address""},
        {""name"": ""amount"", ""type"": ""uint256""}
    ],
    ""name"": ""transfer"",
    ""outputs"": [{""name"": """", ""type"": ""bool""}],
    ""stateMutability"": ""nonpayable"",
    ""type"": ""function""
}]";

var input = new Dictionary<string, object>
{
    { "address", "0xContractAddress" },
    { "abi", JsonConvert.DeserializeObject<List<object>>(abiJson) },
    { "functionName", "transfer" },
    { "args", new List<object> { "0xRecipient", "1000000" } },
};

string txHash = await DynamicSDK.Instance.Networks.Evm.WriteContract(
    wallet.Id, input);

Sign typed data (EIP-712)

Sign structured data according to EIP-712:
var typedData = JsonConvert.DeserializeObject<Dictionary<string, object>>(@"{
    ""types"": {
        ""EIP712Domain"": [
            {""name"": ""name"", ""type"": ""string""},
            {""name"": ""version"", ""type"": ""string""},
            {""name"": ""chainId"", ""type"": ""uint256""}
        ],
        ""Mail"": [
            {""name"": ""from"", ""type"": ""string""},
            {""name"": ""to"", ""type"": ""string""},
            {""name"": ""contents"", ""type"": ""string""}
        ]
    },
    ""primaryType"": ""Mail"",
    ""domain"": { ""name"": ""Example"", ""version"": ""1"", ""chainId"": 1 },
    ""message"": { ""from"": ""Alice"", ""to"": ""Bob"", ""contents"": ""Hello!"" }
}");

string signature = await DynamicSDK.Instance.Networks.Evm.SignTypedData(
    wallet.Id, typedData);

Complete example

using DynamicSDK.Core;
using Newtonsoft.Json;
using UnityEngine;
using System.Collections.Generic;
using System.Linq;

public class EvmTransactionManager : MonoBehaviour
{
    private BaseWallet _evmWallet;
    
    private void Start()
    {
        // Get EVM wallet
        _evmWallet = DynamicSDK.Instance.Wallets.UserWallets
            .FirstOrDefault(w => w.Chain.ToUpper() == "EVM");
    }
    
    public async void SendEth(string toAddress, double amountEth)
    {
        if (_evmWallet == null)
        {
            Debug.LogError("No EVM wallet available");
            return;
        }
        
        try
        {
            long weiAmount = (long)(amountEth * 1e18);
            
            var tx = new Dictionary<string, object>
            {
                { "to", toAddress },
                { "from", _evmWallet.Address },
                { "value", "0x" + weiAmount.ToString("X") }
            };
            
            string txHash = await DynamicSDK.Instance.Networks.Evm.SendTransaction(
                _evmWallet.Address, tx);
            
            Debug.Log($"Transaction sent: {txHash}");
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"Transaction failed: {ex.Message}");
        }
    }
    
    public async void TransferErc20(
        string contractAddress, 
        string toAddress, 
        string amount)
    {
        if (_evmWallet == null)
        {
            Debug.LogError("No EVM wallet available");
            return;
        }
        
        var abiJson = @"[{
            ""inputs"": [
                {""name"": ""to"", ""type"": ""address""},
                {""name"": ""amount"", ""type"": ""uint256""}
            ],
            ""name"": ""transfer"",
            ""outputs"": [{""name"": """", ""type"": ""bool""}],
            ""stateMutability"": ""nonpayable"",
            ""type"": ""function""
        }]";
        
        var input = new Dictionary<string, object>
        {
            { "address", contractAddress },
            { "abi", JsonConvert.DeserializeObject<List<object>>(abiJson) },
            { "functionName", "transfer" },
            { "args", new List<object> { toAddress, amount } },
        };
        
        string txHash = await DynamicSDK.Instance.Networks.Evm.WriteContract(
            _evmWallet.Id, input);
        
        Debug.Log($"ERC20 transfer sent: {txHash}");
    }
}

Next steps