/// <summary> /// Calculate required keys to sign the given transaction /// </summary> /// <param name="availableKeys">available public keys list</param> /// <param name="trx">transaction requiring signatures</param> /// <returns>required public keys</returns> public async Task <List <string> > GetRequiredKeys(List <string> availableKeys, Transaction trx) { int actionIndex = 0; var abiSerializer = new AbiSerializationProvider(Api); var abiResponses = await abiSerializer.GetTransactionAbis(trx); foreach (var action in trx.context_free_actions) { action.data = SerializationHelper.ByteArrayToHexString(abiSerializer.SerializeActionData(action, abiResponses[actionIndex++])); } foreach (var action in trx.actions) { action.data = SerializationHelper.ByteArrayToHexString(abiSerializer.SerializeActionData(action, abiResponses[actionIndex++])); } return((await Api.GetRequiredKeys(new GetRequiredKeysRequest() { available_keys = availableKeys, transaction = trx })).required_keys); }
public async Task <string> CreateTransaction(Transaction trx) { if (EosConfig.SignProvider == null) { throw new ArgumentNullException("SignProvider"); } GetInfoResponse getInfoResult = null; string chainId = EosConfig.ChainId; if (string.IsNullOrWhiteSpace(chainId)) { getInfoResult = await Api.GetInfo(); chainId = getInfoResult.chain_id; } if (trx.expiration == DateTime.MinValue || trx.ref_block_num == 0 || trx.ref_block_prefix == 0) { if (getInfoResult == null) { getInfoResult = await Api.GetInfo(); } var getBlockResult = await Api.GetBlock(new GetBlockRequest() { block_num_or_id = getInfoResult.last_irreversible_block_num.ToString() }); trx.expiration = getInfoResult.head_block_time.AddSeconds(EosConfig.ExpireSeconds); trx.ref_block_num = (UInt16)(getInfoResult.last_irreversible_block_num & 0xFFFF); trx.ref_block_prefix = getBlockResult.ref_block_prefix; } var packedTrx = await AbiSerializer.SerializePackedTransaction(trx); var availableKeys = await EosConfig.SignProvider.GetAvailableKeys(); var requiredKeys = await GetRequiredKeys(availableKeys.ToList(), trx); IEnumerable <string> abis = null; if (trx.actions != null) { abis = trx.actions.Select(a => a.account); } var signatures = await EosConfig.SignProvider.Sign(chainId, requiredKeys, packedTrx, abis); var result = await Api.PushTransaction(new PushTransactionRequest() { signatures = signatures.ToArray(), compression = 0, packed_context_free_data = "", packed_trx = SerializationHelper.ByteArrayToHexString(packedTrx) }); return(result.transaction_id); }
public async Task <string> CreateTransaction(Transaction trx) { // if (VakaConfig.SignProvider == null) // throw new ArgumentNullException("SignProvider"); GetInfoResponse getInfoResult = null; string chainId = VakaConfig.ChainId; if (string.IsNullOrWhiteSpace(chainId)) { getInfoResult = await Api.GetInfo(); chainId = getInfoResult.ChainId; } if (trx.Expiration == DateTime.MinValue || trx.RefBlockNum == 0 || trx.RefBlockPrefix == 0) { if (getInfoResult == null) { getInfoResult = await Api.GetInfo(); } var getBlockResult = await Api.GetBlock(new GetBlockRequest() { BlockNumOrId = getInfoResult.LastIrreversibleBlockNum.GetValueOrDefault().ToString() }); trx.Expiration = getInfoResult.HeadBlockTime.Value.AddSeconds(VakaConfig.ExpireSeconds); trx.RefBlockNum = (UInt16)(getInfoResult.LastIrreversibleBlockNum.Value & 0xFFFF); trx.RefBlockPrefix = getBlockResult.RefBlockPrefix; } var packedTrx = await AbiSerializer.SerializePackedTransaction(trx); IEnumerable <string> signatures = new string[] { }; if (VakaConfig.SignProvider != null) { var availableKeys = await VakaConfig.SignProvider.GetAvailableKeys(); var requiredKeys = await GetRequiredKeys(availableKeys.ToList(), trx); IEnumerable <string> abis = null; if (trx.Actions != null) { abis = trx.Actions.Select(a => a.Account); } signatures = await VakaConfig.SignProvider.Sign(chainId, requiredKeys, packedTrx, abis); } var result = await Api.PushTransaction(new PushTransactionRequest() { Signatures = signatures.ToArray(), Compression = 0, PackedContextFreeData = "", PackedTrx = SerializationHelper.ByteArrayToHexString(packedTrx) }); return(result.TransactionId); }
public async Task GetRequiredKeys() { bool success = false; try { var getInfoResult = await DefaultApi.GetInfo(); var getBlockResult = await DefaultApi.GetBlock(new GetBlockRequest() { BlockNumOrId = getInfoResult.LastIrreversibleBlockNum.Value.ToString() }); var trx = new Transaction() { //trx headers Expiration = getInfoResult.HeadBlockTime.Value.AddSeconds(60), //expire Seconds RefBlockNum = (UInt16)(getInfoResult.LastIrreversibleBlockNum.Value & 0xFFFF), RefBlockPrefix = getBlockResult.RefBlockPrefix, // trx info MaxNetUsageWords = 0, MaxCpuUsageMs = 0, DelaySec = 0, ContextFreeActions = new List <Api.v1.Action>(), Actions = new List <Api.v1.Action>() { new Api.v1.Action() { Account = "eosio.token", Authorization = new List <PermissionLevel>() { new PermissionLevel() { Actor = "tester112345", Permission = "active" } }, Name = "transfer", Data = new { from = "tester112345", to = "tester212345", quantity = "1.0000 EOS", memo = "hello crypto world!" } } }, TransactionExtensions = new List <Extension>() }; int actionIndex = 0; var abiSerializer = new AbiSerializationProvider(DefaultApi); var abiResponses = await abiSerializer.GetTransactionAbis(trx); foreach (var action in trx.ContextFreeActions) { action.Data = SerializationHelper.ByteArrayToHexString(abiSerializer.SerializeActionData(action, abiResponses[actionIndex++])); } foreach (var action in trx.Actions) { action.Data = SerializationHelper.ByteArrayToHexString(abiSerializer.SerializeActionData(action, abiResponses[actionIndex++])); } var getRequiredResult = await DefaultApi.GetRequiredKeys(new GetRequiredKeysRequest() { AvailableKeys = new List <string>() { "EOS8Q8CJqwnSsV4A6HDBEqmQCqpQcBnhGME1RUvydDRnswNngpqfr" }, Transaction = trx }); success = true; } catch (Exception ex) { Console.WriteLine(JsonConvert.SerializeObject(ex)); } Assert.IsTrue(success); }
public static async Task <string> CreateTransaction(Transaction trx) { core.Services.AbiSerializationProvider.Prefix = "VHKD"; var eosConfig = new EosConfigurator() { HttpEndpoint = "http://192.168.1.61", //Mainnet ExpireSeconds = 60, ChainId = "afe97f023511453c09c64f5bb655e7f4dc6694685aff7231219964e9cc521585", SignProvider = new core.Services.DefaultSignProvider("5JNNWKaCoWvN5xojDXsW38Z6uoLmvM9NPh3coQD5z3TgsuY4nmt", "VHKD") }; var api = new EosApi(eosConfig, new HttpHandler()); var abiSerializer = new core.Services.AbiSerializationProvider(api); if (eosConfig.SignProvider == null) { throw new ArgumentNullException("SignProvider"); } GetInfoResponse getInfoResult = null; string chainId = eosConfig.ChainId; if (string.IsNullOrWhiteSpace(chainId)) { getInfoResult = await api.GetInfo(); chainId = getInfoResult.chain_id; } if (trx.expiration == DateTime.MinValue || trx.ref_block_num == 0 || trx.ref_block_prefix == 0) { if (getInfoResult == null) { getInfoResult = await api.GetInfo(); } var getBlockResult = await api.GetBlock(new GetBlockRequest() { block_num_or_id = getInfoResult.last_irreversible_block_num.ToString() }); trx.expiration = getInfoResult.head_block_time.AddSeconds(eosConfig.ExpireSeconds); trx.ref_block_num = (UInt16)(getInfoResult.last_irreversible_block_num & 0xFFFF); trx.ref_block_prefix = getBlockResult.ref_block_prefix; } var packedTrx = await abiSerializer.SerializePackedTransaction(trx); var availableKeys = await eosConfig.SignProvider.GetAvailableKeys(); var requiredKeys = await GetRequiredKeys(api, abiSerializer, availableKeys.ToList(), trx); IEnumerable <string> abis = null; if (trx.actions != null) { abis = trx.actions.Select(a => a.account); } var signatures = await eosConfig.SignProvider.Sign(chainId, requiredKeys, packedTrx, abis); var result = await api.PushTransaction(new PushTransactionRequest() { signatures = signatures.ToArray(), compression = 0, packed_context_free_data = "", packed_trx = SerializationHelper.ByteArrayToHexString(packedTrx) }); return(result.transaction_id); }
public async Task <string> CreatePackedTransaction(TransactionsPackedRequest request) { var action = new EosSharp.Core.Api.v1.Action { account = request.Account, authorization = request.Authorization?.Select(p => new PermissionLevel() { actor = p.Actor, permission = p.Permission }).ToList(), name = request.Name, data = request.Data }; if (action.data != null && action.data is JObject) { action.data = ((JObject)action.data).ToDictionary(); } if (string.IsNullOrEmpty(action.account)) { throw new ArgumentNullException(nameof(request.Account)); } if (string.IsNullOrEmpty(action.name)) { throw new ArgumentNullException(nameof(request.Name)); } if (action.authorization == null || action.authorization.Count == 0) { throw new ArgumentNullException(nameof(request.Authorization)); } var trx = new Transaction() { actions = new List <EosSharp.Core.Api.v1.Action>() { action } }; GetInfoResponse getInfoResult = null; string chainId = m_EosConfig.ChainId; if (string.IsNullOrWhiteSpace(chainId)) { getInfoResult = await m_EosApi.GetInfo(); chainId = getInfoResult.chain_id; } if (trx.expiration == DateTime.MinValue || trx.ref_block_num == 0 || trx.ref_block_prefix == 0) { if (getInfoResult == null) { getInfoResult = await m_EosApi.GetInfo(); } var getBlockResult = await m_EosApi.GetBlock(new GetBlockRequest() { block_num_or_id = getInfoResult.last_irreversible_block_num.ToString() }); trx.expiration = getInfoResult.head_block_time.AddSeconds(m_EosConfig.ExpireSeconds); trx.ref_block_num = (UInt16)(getInfoResult.last_irreversible_block_num & 0xFFFF); trx.ref_block_prefix = getBlockResult.ref_block_prefix; } var packedTrx = await m_AbiSerializer.SerializePackedTransaction(trx); return(SerializationHelper.ByteArrayToHexString(packedTrx)); }
private async Task <PushTransactionResponse> CreateTransaction() { var getInfoResult = await DefaultApi.GetInfo(); var getBlockResult = await DefaultApi.GetBlock(new GetBlockRequest() { block_num_or_id = getInfoResult.last_irreversible_block_num.ToString() }); var trx = new Transaction() { //trx headers expiration = getInfoResult.head_block_time.AddSeconds(60), //expire Seconds ref_block_num = (UInt16)(getInfoResult.last_irreversible_block_num & 0xFFFF), ref_block_prefix = getBlockResult.ref_block_prefix, // trx info max_net_usage_words = 0, max_cpu_usage_ms = 0, delay_sec = 0, context_free_actions = new List <Core.Api.v1.Action>(), transaction_extensions = new List <Extension>(), actions = new List <Core.Api.v1.Action>() { new Core.Api.v1.Action() { account = "eosio.token", authorization = new List <PermissionLevel>() { new PermissionLevel() { actor = "tester112345", permission = "active" } }, name = "transfer", data = new Dictionary <string, object>() { { "from", "tester112345" }, { "to", "tester212345" }, { "quantity", "1.0000 EOS" }, { "memo", "hello crypto world!" } } } } }; var abiSerializer = new AbiSerializationProvider(DefaultApi); var packedTrx = await abiSerializer.SerializePackedTransaction(trx); var requiredKeys = new List <string>() { "EOS8Q8CJqwnSsV4A6HDBEqmQCqpQcBnhGME1RUvydDRnswNngpqfr" }; var signatures = await EosConfig.SignProvider.Sign(DefaultApi.Config.ChainId, requiredKeys, packedTrx); return(await DefaultApi.PushTransaction(new PushTransactionRequest() { signatures = signatures.ToArray(), compression = 0, packed_context_free_data = "", packed_trx = SerializationHelper.ByteArrayToHexString(packedTrx) })); }
public async Task GetRequiredKeys() { var getInfoResult = await DefaultApi.GetInfo(); var getBlockResult = await DefaultApi.GetBlock(new GetBlockRequest() { block_num_or_id = getInfoResult.last_irreversible_block_num.ToString() }); var trx = new Transaction() { //trx headers expiration = getInfoResult.head_block_time.AddSeconds(60), //expire Seconds ref_block_num = (UInt16)(getInfoResult.last_irreversible_block_num & 0xFFFF), ref_block_prefix = getBlockResult.ref_block_prefix, // trx info max_net_usage_words = 0, max_cpu_usage_ms = 0, delay_sec = 0, context_free_actions = new List <Core.Api.v1.Action>(), actions = new List <Core.Api.v1.Action>() { new Core.Api.v1.Action() { account = "eosio.token", authorization = new List <PermissionLevel>() { new PermissionLevel() { actor = "tester112345", permission = "active" } }, name = "transfer", data = new Dictionary <string, object>() { { "from", "tester112345" }, { "to", "tester212345" }, { "quantity", "1.0000 EOS" }, { "memo", "hello crypto world!" } } } }, transaction_extensions = new List <Extension>() }; int actionIndex = 0; var abiSerializer = new AbiSerializationProvider(DefaultApi); var abiResponses = await abiSerializer.GetTransactionAbis(trx); foreach (var action in trx.context_free_actions) { action.data = SerializationHelper.ByteArrayToHexString(abiSerializer.SerializeActionData(action, abiResponses[actionIndex++])); } foreach (var action in trx.actions) { action.data = SerializationHelper.ByteArrayToHexString(abiSerializer.SerializeActionData(action, abiResponses[actionIndex++])); } var getRequiredResult = await DefaultApi.GetRequiredKeys(new GetRequiredKeysRequest() { available_keys = new List <string>() { "EOS8Q8CJqwnSsV4A6HDBEqmQCqpQcBnhGME1RUvydDRnswNngpqfr" }, transaction = trx }); }