When using the Klyntar network, you may need to work in two environments:
In the native environment - using WASM smart contracts, interacting with system smart contracts, etc.
Or use the EVM environment with its smart contracts, working with the web3 SDK and JSON-RPC interfaces for compatibility, for example, with various wallets.
Situations might be different, so you will need to know how to transfer coins from one environment to another. Let's learn!
Transfer coins from native KLY environment to EVM
When you need to transfer coins from the native environment to the EVM - just use the standard methods of creating a transaction - as described in the previous sections 😉
Imagine that your account had such balance before tx:
Recipient account:
Transaction:
Note the touchedAccounts field in the payload - this is how we run the transaction in parallel mode ⚡
Sender account after tx:
Recipient account after tx:
Transfer coins from EVM to native KLY environment
If you are transferring coins from the EVM environment to the native one, you need to:
Initiate a transaction to the address 0xdead
In the data field, you need to encode a JSON object with the to field
In this case, the coins will go to the native environment to the to address and on the same shard.
State before transaction
The sender account before transaction:
Recipient account before transaction:
Let's use a typical web3 library to see how we can transfer some coins from sender to recipient:
import {Transaction} from '@ethereumjs/tx';
import {Common} from '@ethereumjs/common';
import Web3 from 'web3';
const web3 = new Web3('http://localhost:7332/kly_evm_rpc');
// KLY-EVM
const common = Common.custom({name:'KLYNTAR',networkId:'0x1CA3',chainId:'0x1CA3'},{hardfork:'london'});
const evmAccount0 = {
address:'0x069bdf66961ce2D38eBe48DD2E095f2c8015ac82',
privateKey:Buffer.from('a06d4e98075df20d90972dfec819a8711c8d245423f9d3a13f809505f81fbcb8','hex')
};
let nonce = await web3.eth.getTransactionCount(evmAccount0.address);
let dataToPass = {
to: 'GUbYLN5NqmRocMBHqS183r2FQRoUjhx1p5nKyyUBpntQ',
touchedAccounts: [evmAccount0.address.toLowerCase(),'0x000000000000000000000000000000000000dead','GUbYLN5NqmRocMBHqS183r2FQRoUjhx1p5nKyyUBpntQ'],
// rev_t(?) - for new BLS multisig accounts,
// pqcPub(?) - for new post-quantum accounts
};
let hexEncodedData = web3.utils.asciiToHex(JSON.stringify(dataToPass));
// Build a transaction
let txObject = {
from:evmAccount0.address,
nonce:web3.utils.toHex(nonce),
to:'0x000000000000000000000000000000000000dead',
value: web3.utils.toHex(web3.utils.toWei('1.337','ether')),
gasLimit: web3.utils.toHex(230000),
gasPrice: web3.utils.toHex(web3.utils.toWei('100','gwei')),
// Set payload here - it will be parsed by KLY-EVM
data: hexEncodedData
};
let tx = Transaction.fromTxData(txObject,{common}).sign(evmAccount0.privateKey);
console.log('Tx hash is => ','0x'+tx.hash().toString('hex'));
console.log(tx.toJSON());
// Send
web3.eth.sendSignedTransaction(raw,(err,txHash) => console.log(err?`Oops,some error has been occured ${err}`:`Success ———> ${txHash}`));