public async Task CreateWalletForUserAsync(ApplicationUser user, string seed = null, bool isDefault = false) { var walletName = Guid.NewGuid().ToString(); Wallet wallet = null; try { await Wallet.CreateWalletAsync(_configuration.GetValue("Indy.PoolName", "indy_pool"), walletName, null, null, null); wallet = await Wallet.OpenWalletAsync(walletName, null, null); var seedString = string.IsNullOrEmpty(seed) ? "{}" : DidJson.GetJson(seed); var didResult = await Did.CreateAndStoreMyDidAsync(wallet, seedString); await SaveWalletData(walletName, user.Id, didResult.Did, didResult.VerKey, true); } catch (Exception) { throw; } finally { await CloseWalletAsync(wallet); } }
public async Task CreateWalletAsync(ApplicationUser user, bool isTrustAnchor, string stewardId = null, string seed = null) { WalletData stewardWalletData = null; Wallet stewardWallet = null; if (!string.IsNullOrEmpty(stewardId)) { stewardWalletData = await _dbContext.WalletDatas.FirstOrDefaultAsync(p => p.UserId == stewardId); if (stewardWalletData == null) { throw new Exception("Agent Wallet not found."); } stewardWallet = await Wallet.OpenWalletAsync(stewardWalletData.Name, null, null); } var walletName = $"{user.Id}"; Wallet wallet = null; try { await Wallet.CreateWalletAsync(_configuration.GetValue("Indy.PoolName", "indy_pool"), walletName, null, null, null); wallet = await Wallet.OpenWalletAsync(walletName, null, null); var didJson = "{}"; if (!string.IsNullOrEmpty(seed)) { didJson = DidJson.GetJson(seed); } var didResult = await Did.CreateAndStoreMyDidAsync(wallet, didJson); var walletData = new WalletData { UserId = user.Id, TimeCreated = DateTime.UtcNow, Did = didResult.Did, Name = walletName, VerKey = didResult.VerKey }; _dbContext.WalletDatas.Add(walletData); if (stewardWalletData != null) { if (isTrustAnchor) { var stewardAgentDidResult = await Did.CreateAndStoreMyDidAsync(stewardWallet, "{}"); var nymRequest = await Ledger.BuildNymRequestAsync(stewardWalletData.Did, stewardAgentDidResult.Did, stewardAgentDidResult.VerKey, null, "TRUST_ANCHOR"); using (var pool = await PoolUtils.CreateAndOpenPoolLedgerAsync()) { var res = await Ledger.SignAndSubmitRequestAsync(pool, stewardWallet, stewardWalletData.Did, nymRequest); var stewardAgentVerKey = await Did.KeyForDidAsync(pool, wallet, stewardAgentDidResult.Did); var connectionResponse = JsonConvert.SerializeObject(new { did = stewardAgentDidResult.Did, verkey = stewardAgentVerKey, nonce = 21314123141 }); var anoncryptedConnectionResponse = await Crypto.AnonCryptAsync(stewardAgentVerKey, Encoding.UTF8.GetBytes(connectionResponse)); var decryptedConnectionResponse = Encoding.UTF8.GetString(await Crypto.AnonDecryptAsync(stewardWallet, stewardAgentDidResult.VerKey, anoncryptedConnectionResponse)); var connectionResponseObj = JObject.Parse(decryptedConnectionResponse); nymRequest = await Ledger.BuildNymRequestAsync(stewardWalletData.Did, connectionResponseObj.Value <string>("did"), connectionResponseObj.Value <string>("verkey"), null, "TRUST_ANCHOR"); var signAndSubmitRequestResult = await Ledger.SignAndSubmitRequestAsync(pool, stewardWallet, stewardWalletData.Did, nymRequest); // getting verinym } } } await _dbContext.SaveChangesAsync(); } catch (Exception) { throw; } finally { await CloseWalletAsync(wallet); await CloseWalletAsync(stewardWallet); } }