/// <summary> /// Prepare deposit with given tokens to the child chain /// </summary> /// <param name="profileFrom">profile of the sender</param> /// <param name="currency">transaction currency</param> /// <param name="data">data to prepare (amount for ERC20, tokenid for ERC721)</param> /// <returns></returns> public async Task <BCTransaction> PrepareDeposit(Profile profileFrom, string currency, BigInteger data) { if (rootChainContract != null) { Nethereum.Signer.Transaction approveTx = null; var currencyType = await GetCurrencyType(currency); var tokenHandler = web3.Eth.GetContractHandler(currency); if (!IsFungibleCurrency(currencyType)) { // TODO approve one item (ApproveFunction) or all (SetApprovalForAllFunction)? var approveFunc = tokenHandler.GetFunction <Nethereum.StandardNonFungibleTokenERC721.ContractDefinition.ApproveFunction>(); var approveInput = new Nethereum.StandardNonFungibleTokenERC721.ContractDefinition.ApproveFunction(); approveInput.To = rootChainContract.Address; approveInput.TokenId = data; approveTx = await ContractHelper.CreateTransaction(web3, profileFrom.ID, BigInteger.Zero, approveFunc, approveInput); } else { var approveFunc = tokenHandler.GetFunction <Nethereum.StandardTokenEIP20.ContractDefinition.ApproveFunction>(); var approveInput = new Nethereum.StandardTokenEIP20.ContractDefinition.ApproveFunction(); approveInput.Spender = rootChainContract.Address; approveInput.Value = data; approveTx = await ContractHelper.CreateTransaction(web3, profileFrom.ID, BigInteger.Zero, approveFunc, approveInput); } string signedApproveTx = await SignTransaction(profileFrom, approveTx); return(await SubmitTransactionOnRootChain(web3, signedApproveTx)); } return(null); }