public Web3.Web3 GetWeb3() { var web3 = new Web3.Web3(_ethereumClientIntegrationFixture.GetWeb3().TransactionManager.Account, "http://localhost:8545", LogManager.GetLogger <ILog>()); return(web3); }
public async void ShouldBeAbleToHandleNoncesOfMultipleTxnSingleWeb3SingleThreaded() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var privateKey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7"; var abi = @"[{""constant"":false,""inputs"":[{""name"":""val"",""type"":""int256""}],""name"":""multiply"",""outputs"":[{""name"":""d"",""type"":""int256""}],""type"":""function""},{""inputs"":[{""name"":""multiplier"",""type"":""int256""}],""type"":""constructor""}]"; var byteCode = "0x60606040526040516020806052833950608060405251600081905550602b8060276000396000f3606060405260e060020a60003504631df4f1448114601a575b005b600054600435026060908152602090f3"; var multiplier = 7; var web3 = new Web3.Web3(new Account(privateKey), ClientFactory.GetClient()); var txn1 = await web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, new HexBigInteger(900000), null, multiplier); var txn2 = await web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, new HexBigInteger(900000), null, multiplier); var txn3 = await web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, new HexBigInteger(900000), null, multiplier); var pollService = new TransactionReceiptPollingService(web3.TransactionManager); var receipt1 = pollService.PollForReceiptAsync(txn1); var receipt2 = pollService.PollForReceiptAsync(txn2); var receipt3 = pollService.PollForReceiptAsync(txn3); Assert.NotNull(receipt1); Assert.NotNull(receipt2); Assert.NotNull(receipt3); }
public async Task <bool> SetUrl(string url, int networkId = 1) { Ensure.ArgumentCondition(Nethereum.UI.Util.Utils.IsValidUrl(url), "Invalid url", "Url"); var web3 = new Web3.Web3(url); try { var blockNumber = await web3.Eth.Blocks.GetBlockNumber.SendRequestAsync(); Url = url; SelectedNetwork = networkId; if (NetworkChanged != null) { await NetworkChanged(networkId); } _enabledCallback.OnNext(Enabled); return(true); } catch // toasts and other stuff { Url = null; _enabledCallback.OnNext(Enabled); return(false); } }
public async Task ShouldBeAbleToTransferBetweenAccountsUsingThePrivateKey() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var addressTo = "0x13f022d72158410433cbd66f5dd8bf6d2d129924"; var password = "******"; var privateKey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7"; // The default account is an account which is mananaged by the user var account = new Account(privateKey); var web3 = new Web3.Web3(account); //The transaction receipt polling service is a simple utility service to poll for receipts until mined var transactionPolling = new TransactionReceiptPollingService(web3); var currentBalance = await web3.Eth.GetBalance.SendRequestAsync(addressTo); //assumed client is mining already //when sending a transaction using an Account, a raw transaction is signed and send using the private key var transactionReceipt = await transactionPolling.SendRequestAsync(() => web3.TransactionManager.SendTransactionAsync(account.Address, addressTo, new HexBigInteger(20)) ); var newBalance = await web3.Eth.GetBalance.SendRequestAsync(addressTo); Assert.Equal(currentBalance.Value + 20, newBalance.Value); }
public StorageProcessor(string url, IUnitOfWork repositoryBase) { web3 = new Web3.Web3(url); blockProcessor = new BlockProcessor(web3, repositoryBase); transactionsProcessor = new TransactionsProcessor(web3, repositoryBase); this.repositoryBase = repositoryBase; }
public async Task ShouldBeAbleToTransferBetweenAccountsLoadingEncryptedPrivateKey() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var addressTo = "0x13f022d72158410433cbd66f5dd8bf6d2d129924"; var password = "******"; var keyStoreEncryptedJson = @"{""crypto"":{""cipher"":""aes-128-ctr"",""ciphertext"":""b4f42e48903879b16239cd5508bc5278e5d3e02307deccbec25b3f5638b85f91"",""cipherparams"":{""iv"":""dc3f37d304047997aa4ef85f044feb45""},""kdf"":""scrypt"",""mac"":""ada930e08702b89c852759bac80533bd71fc4c1ef502291e802232b74bd0081a"",""kdfparams"":{""n"":65536,""r"":1,""p"":8,""dklen"":32,""salt"":""2c39648840b3a59903352b20386f8c41d5146ab88627eaed7c0f2cc8d5d95bd4""}},""id"":""19883438-6d67-4ab8-84b9-76a846ce544b"",""address"":""12890d2cce102216644c59dae5baed380d84830c"",""version"":3}"; //this is your wallet key file which can be found on //Linux: ~/.ethereum/keystore //Mac: /Library/Ethereum/keystore //Windows: %APPDATA%/Ethereum //if not using portable or netstandard (^net45) you can use LoadFromKeyStoreFile to load the file from the file system. var account = Account.LoadFromKeyStore(keyStoreEncryptedJson, password); var web3 = new Web3.Web3(account); //The transaction receipt polling service is a simple utility service to poll for receipts until mined var transactionPolling = new TransactionReceiptPollingService(web3); var currentBalance = await web3.Eth.GetBalance.SendRequestAsync(addressTo); //assumed client is mining already //when sending a transaction using an Account, a raw transaction is signed and send using the private key var transactionReceipt = await transactionPolling.SendRequestAsync(() => web3.TransactionManager.SendTransactionAsync(account.Address, addressTo, new HexBigInteger(20)) ); var newBalance = await web3.Eth.GetBalance.SendRequestAsync(addressTo); Assert.Equal(currentBalance.Value + 20, newBalance.Value); }
public async void ShouldDeployAContractWithConstructor() { using (var testrpcRunner = new TestRPCEmbeddedRunner()) { try { testrpcRunner.RedirectOuputToDebugWindow = true; testrpcRunner.StartTestRPC(); var web3 = new Web3.Web3(); var addressFrom = (await web3.Eth.Accounts.SendRequestAsync())[0]; var transactionService = new TransactionReceiptPollingService(web3.TransactionManager); var previousVersionAddress = "0x12890d2cce102216644c59dae5baed380d84830c"; var registrySevice = await UportRegistryService.DeployContractAndGetServiceAsync(transactionService, web3, addressFrom, previousVersionAddress, new HexBigInteger(4712388)); Assert.Equal(previousVersionAddress, await registrySevice.PreviousPublishedVersionAsyncCall()); } finally { testrpcRunner.StopTestRPC(); } } }
private async void BtnGetAccoutns_OnClick(object sender, RoutedEventArgs e) { var web3 = new Web3.Web3("https://mainnet.infura.io"); var balance = await web3.Eth.GetBalance.SendRequestAsync("0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe"); this.Dispatcher.Invoke(() => { txtAccounts.Text = Web3.Web3.Convert.FromWei(balance.Value).ToString(); }); }
public async void ShouldTransferWholeBalanceInEther() { var web3 = _ethereumClientIntegrationFixture.GetWeb3(); var privateKey = EthECKey.GenerateKey(); var newAccount = new Account(privateKey.GetPrivateKey(), EthereumClientIntegrationFixture.ChainId); var toAddress = newAccount.Address; var transferService = web3.Eth.GetEtherTransferService(); var receipt = await web3.Eth.GetEtherTransferService() .TransferEtherAndWaitForReceiptAsync(toAddress, 0.1m, gasPriceGwei: 2).ConfigureAwait(false); var balance = await web3.Eth.GetBalance.SendRequestAsync(toAddress).ConfigureAwait(false); Assert.Equal(0.1m, Web3.Web3.Convert.FromWei(balance)); var totalAmountBack = await transferService.CalculateTotalAmountToTransferWholeBalanceInEtherAsync(toAddress, 2m).ConfigureAwait(false); var web32 = new Web3.Web3(newAccount, web3.Client); var receiptBack = await web32.Eth.GetEtherTransferService() .TransferEtherAndWaitForReceiptAsync(EthereumClientIntegrationFixture.AccountAddress, totalAmountBack, gasPriceGwei: 2).ConfigureAwait(false); var balanceFrom = await web32.Eth.GetBalance.SendRequestAsync(toAddress).ConfigureAwait(false); Assert.Equal(0, Web3.Web3.Convert.FromWei(balanceFrom)); }
private string TransferEventKeccak = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; //keccak of transfer event public TransactionsProcessor(Web3.Web3 web3, IUnitOfWork _repositoryBase) { this.web3 = web3; this.repositoryBase = _repositoryBase; transactionRepository = _repositoryBase.GetRepository <NodeTransaction>(); blockRepository = _repositoryBase.GetRepository <NodeBlock>(); }
private BlockchainProcessor CreateBlockChainProcessor(TRepositoryFactory repoFactory) { var web3 = new Web3.Web3(TargetConfiguration.BlockchainUrl); var steps = new BlockProcessingSteps(); steps.BlockStep.AddProcessorHandler((b) => { log.Info($"Processing block {b.Number.Value}, Tx Count: {b.Transactions.Length}"); return(Task.CompletedTask); }); steps.TransactionReceiptStep.AddProcessorHandler((tx) => { log.Info($"\tTransaction: Index: {tx.Transaction.TransactionIndex}, Hash: {tx.TransactionHash}"); return(Task.CompletedTask); }); steps.FilterLogStep.AddProcessorHandler((l) => { log.Info($"\t\tLog: Index: {l.LogIndex}"); return(Task.CompletedTask); }); var orchestrator = new BlockCrawlOrchestrator(web3.Eth, steps); orchestrator.ContractCreatedCrawlerStep.RetrieveCode = true; var lastConfirmedBlockNumberService = new LastConfirmedBlockNumberService( web3.Eth.Blocks.GetBlockNumber, TargetConfiguration.MinimumBlockConfirmations ?? LastConfirmedBlockNumberService.DEFAULT_BLOCK_CONFIRMATIONS, log); IBlockProgressRepository progressRepo = repoFactory.CreateBlockProgressRepository(); var processor = new BlockchainProcessor(orchestrator, progressRepo, lastConfirmedBlockNumberService, log); return(processor); }
public async void ShouldResolveNameFromMainnet() { var web3 = new Web3.Web3("https://mainnet.infura.io"); var fullNameNode = new EnsUtil().GetNameHash("nickjohnson.eth"); var ensRegistryService = new ENSRegistryService(web3, "0x314159265dd8dbb310642f98f50c066173c1259b"); //get the resolver address from ENS var resolverAddress = await ensRegistryService.ResolverQueryAsync( new ResolverFunction() { Node = fullNameNode.HexToByteArray() }); Assert.Equal("0x1da022710df5002339274aadee8d58218e9d6ab5", resolverAddress); //using the resolver address we can create our service (should be an abstract / interface based on abi as we can have many) var resolverService = new PublicResolverService(web3, resolverAddress); //and get the address from the resolver var theAddress = await resolverService.AddrQueryAsync(new AddrFunction() { Node = fullNameNode.HexToByteArray() }); //Owner address var expectedAddress = "0xfdb33f8ac7ce72d7d4795dd8610e323b4c122fbb"; Assert.Equal(expectedAddress.ToLower(), theAddress.ToLower()); }
public async Task FilterLogsWithCriteria() { const string INDEX_NAME = "filter-logs-with-criteria"; //surround with "using" so that anything in a buffer is sent on dispose using (var azureSearchService = new AzureSearchService(AzureSearchServiceName, _azureSearchApiKey)) { try { // create an index - if an existing index is required: azureSearchService.GetIndexAsync() var index = await azureSearchService.CreateIndexForLogAsync(INDEX_NAME); var indexer = azureSearchService.CreateIndexerForLog( index.Name, documentsPerBatch: 1); var web3 = new Web3.Web3(BlockchainUrl); var blockchainProcessor = web3.Processing.Logs.CreateProcessor( action: log => indexer.IndexAsync(log), criteria: log => AddressUtil.Current.AreAddressesTheSame(log.Address, "0x9edcb9a9c4d34b5d6a082c86cb4f117a1394f831")); var cancellationTokenSource = new CancellationTokenSource(); await blockchainProcessor.ExecuteAsync(3146685, cancellationTokenSource.Token, 3146684); await Task.Delay(5000); // allow time to index Assert.Equal(2, await azureSearchService.CountDocumentsAsync(INDEX_NAME)); } finally { await azureSearchService.DeleteIndexAsync(INDEX_NAME); } } }
public async void ShouldBeAbleTransferTokensUsingTheHdWallet() { var wallet = new Wallet(Words, Password); var account = wallet.GetAccount(0); var web3 = new Web3.Web3(account, _ethereumClientIntegrationFixture.GetWeb3().Client); ulong totalSupply = 1000000; var contractByteCode = "0x6060604052341561000f57600080fd5b604051602080610711833981016040528080519150505b60018054600160a060020a03191633600160a060020a0390811691909117918290556000838155911681526002602052604090208190555b505b6106a28061006f6000396000f300606060405236156100a15763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100a6578063095ea7b31461013157806318160ddd1461016757806323b872dd1461018c578063313ce567146101c857806370a08231146101f15780638da5cb5b1461022257806395d89b4114610251578063a9059cbb146102dc578063dd62ed3e14610312575b600080fd5b34156100b157600080fd5b6100b9610349565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100f65780820151818401525b6020016100dd565b50505050905090810190601f1680156101235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561013c57600080fd5b610153600160a060020a0360043516602435610380565b604051901515815260200160405180910390f35b341561017257600080fd5b61017a6103ed565b60405190815260200160405180910390f35b341561019757600080fd5b610153600160a060020a03600435811690602435166044356103f4565b604051901515815260200160405180910390f35b34156101d357600080fd5b6101db610510565b60405160ff909116815260200160405180910390f35b34156101fc57600080fd5b61017a600160a060020a0360043516610515565b60405190815260200160405180910390f35b341561022d57600080fd5b610235610534565b604051600160a060020a03909116815260200160405180910390f35b341561025c57600080fd5b6100b9610543565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156100f65780820151818401525b6020016100dd565b50505050905090810190601f1680156101235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102e757600080fd5b610153600160a060020a036004351660243561057a565b604051901515815260200160405180910390f35b341561031d57600080fd5b61017a600160a060020a0360043581169060243516610649565b60405190815260200160405180910390f35b60408051908101604052601a81527f4578616d706c6520466978656420537570706c7920546f6b656e000000000000602082015281565b600160a060020a03338116600081815260036020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b6000545b90565b600160a060020a0383166000908152600260205260408120548290108015906104445750600160a060020a0380851660009081526003602090815260408083203390941683529290522054829010155b80156104505750600082115b80156104755750600160a060020a038316600090815260026020526040902054828101115b1561050457600160a060020a0380851660008181526002602081815260408084208054899003905560038252808420338716855282528084208054899003905594881680845291905290839020805486019055917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001610508565b5060005b5b9392505050565b601281565b600160a060020a0381166000908152600260205260409020545b919050565b600154600160a060020a031681565b60408051908101604052600581527f4649584544000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a0333166000908152600260205260408120548290108015906105a35750600082115b80156105c85750600160a060020a038316600090815260026020526040902054828101115b1561063a57600160a060020a033381166000818152600260205260408082208054879003905592861680825290839020805486019055917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060016103e7565b5060006103e7565b5b92915050565b600160a060020a038083166000908152600360209081526040808320938516835292905220545b929150505600a165627a7a72305820ec01add6c7f9d88976180c397e2a5b2e9f8fc1f95f5abb00e2a4c9dbf7bcfaf20029"; var abi = "[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"totalSupply\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"totalSupply\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}]"; var receipt = await web3.Eth.DeployContract.SendRequestAndWaitForReceiptAsync(abi, contractByteCode, account.Address, new HexBigInteger(3000000), null, totalSupply); var standarErc20Service = new StandardTokenService(web3, receipt.ContractAddress); var pollingService = new TransactionReceiptPollingService(web3.TransactionManager); var transactionHash = await standarErc20Service.TransferRequestAsync( "0x98f5438cDE3F0Ff6E11aE47236e93481899d1C47", 10); var receiptSend = await pollingService.PollForReceiptAsync(transactionHash); var balance = await standarErc20Service.BalanceOfQueryAsync("0x98f5438cDE3F0Ff6E11aE47236e93481899d1C47"); Assert.Equal(10, balance); }
public async Task FilterLogs() { const string INDEX_NAME = "filter-logs"; //surround with "using" so that anything in a buffer is sent on dispose //to clear the buffer manually - searchIndexProcessor.EventIndexer.SubmitPendingItemsAsync() using (var azureSearchService = new AzureSearchService(AzureSearchServiceName, _azureSearchApiKey)) { try { // create an index - if an existing index is required: azureSearchService.GetIndexAsync() var index = await azureSearchService.CreateIndexForLogAsync(INDEX_NAME); var indexer = azureSearchService.CreateIndexerForLog(index.Name, documentsPerBatch: 1); var web3 = new Web3.Web3(BlockchainUrl); var blockchainProcessor = web3.Processing.Logs.CreateProcessor(log => indexer.IndexAsync(log)); var cancellationTokenSource = new CancellationTokenSource(); await blockchainProcessor.ExecuteAsync(3146685, cancellationTokenSource.Token, 3146684); await Task.Delay(5000); // allow time to index Assert.Equal(25, await azureSearchService.CountDocumentsAsync(INDEX_NAME)); } finally { await azureSearchService.DeleteIndexAsync(INDEX_NAME); } } }
public async Task ShouldBeAbleToDeployAContractUsingPrivateKey() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var privateKey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7"; var abi = @"[{""constant"":false,""inputs"":[{""name"":""val"",""type"":""int256""}],""name"":""multiply"",""outputs"":[{""name"":""d"",""type"":""int256""}],""type"":""function""},{""inputs"":[{""name"":""multiplier"",""type"":""int256""}],""type"":""constructor""}]"; var byteCode = "0x60606040526040516020806052833950608060405251600081905550602b8060276000396000f3606060405260e060020a60003504631df4f1448114601a575b005b600054600435026060908152602090f3"; var multiplier = 7; var web3 = new Web3.Web3(new Account(privateKey)); var receipt = await web3.Eth.DeployContract.SendRequestAndWaitForReceiptAsync(abi, byteCode, senderAddress, new HexBigInteger(900000), null, multiplier); var contract = web3.Eth.GetContract(abi, receipt.ContractAddress); var multiplyFunction = contract.GetFunction("multiply"); var result = await multiplyFunction.CallAsync <int>(7); Assert.Equal(49, result); }
public async Task Run() { var web3 = new Web3.Web3(TestConfiguration.BlockchainUrls.Infura.Rinkeby); var transactionHandler = new SimpleTransactionHandler(); var handlers = new HandlerContainer { TransactionHandler = transactionHandler }; //only tx sent to this address var transactionFilter = TransactionFilter.To("0xc0e15e11306334258d61fee52a22d15e6c9c59e0"); var filter = new FilterContainer(transactionFilter); var blockProcessor = BlockProcessorFactory.Create( web3, handlers, filter, processTransactionsInParallel: false); var processingStrategy = new ProcessingStrategy(blockProcessor); var blockchainProcessor = new BlockchainProcessor(processingStrategy); var result = await blockchainProcessor.ExecuteAsync(2830143, 2830153); Assert.True(result); Assert.Equal(12, transactionHandler.TransactionsHandled.Count); Assert.Empty(transactionHandler.ContractCreationTransactionsHandled); }
public async Task ShouldBeAbleToDeployAContract() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var password = "******"; var abi = @"[{""constant"":false,""inputs"":[{""name"":""a"",""type"":""int256""}],""name"":""multiply"",""outputs"":[{""name"":""r"",""type"":""int256""}],""type"":""function""},{""inputs"":[{""name"":""multiplier"",""type"":""int256""}],""type"":""constructor""}]"; var byteCode = "0x606060405260405160208060ae833981016040528080519060200190919050505b806000600050819055505b5060768060386000396000f360606040526000357c0100000000000000000000000000000000000000000000000000000000900480631df4f144146037576035565b005b604b60048080359060200190919050506061565b6040518082815260200191505060405180910390f35b6000600060005054820290506071565b91905056"; var multiplier = 7; var web3 = new Web3.Web3(); var unlockResult = await web3.Personal.UnlockAccount.SendRequestAsync(senderAddress, password, new HexBigInteger(60)); Assert.True(unlockResult); var transactionHash = await web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, multiplier); var miningResult = await web3.Miner.Start.SendRequestAsync(6); Assert.True(miningResult); var receipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(transactionHash); while(receipt == null){ Thread.Sleep(1000); receipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(transactionHash); } var contractAddress = receipt.ContractAddress; var contract = web3.Eth.GetContract(abi, contractAddress); var multiplyFunction = contract.GetFunction("multiply"); var result = await multiplyFunction.CallAsync<int>(7); Assert.Equal(49, result); }
public async Task StartHere() { var web3 = new Web3.Web3(TestConfiguration.BlockchainUrls.Infura.Rinkeby); //create an in-memory context and repository factory var context = new InMemoryBlockchainStorageRepositoryContext(); var repoFactory = new InMemoryBlockchainStoreRepositoryFactory(context); //create our processor var processor = web3.Processing.Blocks.CreateBlockStorageProcessor(repoFactory); //if we need to stop the processor mid execution - call cancel on the token var cancellationToken = new CancellationToken(); //crawl the required block range await processor.ExecuteAsync( toBlockNumber : new BigInteger(2830145), cancellationToken : cancellationToken, startAtBlockNumberIfNotProcessed : new BigInteger(2830144)); Assert.Equal(2, context.Blocks.Count); Assert.Equal(25, context.Transactions.Count); Assert.Equal(5, context.Contracts.Count); Assert.Equal(55, context.AddressTransactions.Count); Assert.Equal(28, context.TransactionLogs.Count); }
public async void ShouldTransferWholeBalanceInEther() { var web3 = _ethereumClientIntegrationFixture.GetWeb3(); var privateKey = EthECKey.GenerateKey(); var newAccount = new Account(privateKey.GetPrivateKey()); var toAddress = newAccount.Address; var transferService = web3.Eth.GetEtherTransferService(); var receipt = await web3.Eth.GetEtherTransferService() .TransferEtherAndWaitForReceiptAsync(toAddress, 1000, 2); var balance = await web3.Eth.GetBalance.SendRequestAsync(toAddress); Assert.Equal(1000, Web3.Web3.Convert.FromWei(balance)); var totalAmountBack = await transferService.CalculateTotalAmountToTransferWholeBalanceInEther(toAddress, 2); var web32 = new Web3.Web3(newAccount, web3.Client); var receiptBack = await web32.Eth.GetEtherTransferService() .TransferEtherAndWaitForReceiptAsync(AccountFactory.Address, totalAmountBack, 2); var balanceFrom = await web32.Eth.GetBalance.SendRequestAsync(toAddress); Assert.Equal(0, Web3.Web3.Convert.FromWei(balanceFrom)); }
public Web3.Web3 GetWeb3() { var web3 = new Web3.Web3(_ethereumClientIntegrationFixture.GetWeb3().TransactionManager.Account, _ethereumClientIntegrationFixture.GetHttpUrl(), LogManager.GetLogger <ILog>()); return(web3); }
public async Task ShouldBeAbleToTransferBetweenAccountsUsingManagedAccount() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var addressTo = "0x13f022d72158410433cbd66f5dd8bf6d2d129924"; var password = "******"; // A managed account is an account which is maintained by the client (Geth / Parity) var account = new ManagedAccount(senderAddress, password); var web3 = new Web3.Web3(account); //The transaction receipt polling service is a simple utility service to poll for receipts until mined var transactionPolling = (TransactionReceiptPollingService)web3.TransactionManager.TransactionReceiptService; var currentBalance = await web3.Eth.GetBalance.SendRequestAsync(addressTo); //assumed client is mining already //When sending the transaction using the transaction manager for a managed account, personal_sendTransaction is used. var txnHash = await web3.TransactionManager.SendTransactionAsync(account.Address, addressTo, new HexBigInteger(20)); var receipt = await transactionPolling.PollForReceiptAsync(txnHash); var newBalance = await web3.Eth.GetBalance.SendRequestAsync(addressTo); Assert.Equal(currentBalance.Value + 20, newBalance.Value); }
public static async Task TestTransferTokenSigning() { using (var trezorManager = await TrezorFactory.GetWindowsConnectedLedgerManagerAsync(GetPin)) { await trezorManager.InitializeAsync(); var signer = new TrezorExternalSigner(trezorManager, 0); var account = new ExternalAccount(signer); await account.InitialiseAsync(); var rpcClient = new RpcClient(new Uri("http://localhost:8545")); account.InitialiseDefaultTransactionManager(rpcClient); var web3 = new Web3.Web3(account, rpcClient); var tx = new TransferFunction() { Nonce = 10, GasPrice = 10, Gas = 21000, To = "0x689c56aef474df92d44a1b70850f808488f9769c", Value = 100, FromAddress = "0x6A1D4583b83E5ef91EeA1E591aD333BD04853399" }; var signature = await web3.Eth.GetContractTransactionHandler <TransferFunction>().SignTransactionAsync("0x6810e776880c02933d47db1b9fc05908e5386b96", tx); var web32 = new Web3.Web3(new Account("0x2e14c29aaecd1b7c681154d41f50c4bb8b6e4299a431960ed9e860e39cae6d29")); var signatureNethereum = await web32.Eth.GetContractTransactionHandler <TransferFunction>() .SignTransactionAsync("0x6810e776880c02933d47db1b9fc05908e5386b96", tx); System.Console.WriteLine("Trezor: " + signature); System.Console.WriteLine("Nethereum: " + signatureNethereum); } }
public async Task <TransactionReceipt[]> SendTransactionsAsync(Web3.Web3 web3, string addressFrom, string pass, params Func <Task <string> >[] transactionsTask) { var result = await web3.Personal.UnlockAccount.SendRequestAsync(addressFrom, pass, new HexBigInteger(600000)); if (result != true) { throw new Exception("Acccount not unlocked"); } var txIds = new List <string>(); foreach (var transactionTask in transactionsTask) { var txId = await transactionTask(); txIds.Add(txId); } var receipts = new List <TransactionReceipt>(); foreach (var txId in txIds) { receipts.Add(await GetTransactionReceipt(web3, txId)); } return(receipts.ToArray()); }
public async Task <TransactionReceipt> SendTransactionAsync(Web3.Web3 web3, string addressFrom, string pass, Func <Task <string> > transactionTask) { var receitps = await SendTransactionsAsync(web3, addressFrom, pass, transactionTask); return(receitps[0]); }
public async Task WithCriteria() { var web3 = new Web3.Web3(TestConfiguration.BlockchainUrls.Infura.Rinkeby); //create an in-memory context and repository factory var context = new InMemoryBlockchainStorageRepositoryContext(); var repoFactory = new InMemoryBlockchainStoreRepositoryFactory(context); //create our processor - we're only interested in tx from a specific address var processor = web3.Processing.Blocks.CreateBlockStorageProcessor(repoFactory, configureSteps: steps => { steps.TransactionStep.SetMatchCriteria(t => t.Transaction.IsFrom("0x1cbff6551b8713296b0604705b1a3b76d238ae14")); }); //if we need to stop the processor mid execution - call cancel on the token var cancellationToken = new CancellationToken(); //crawl the required block range await processor.ExecuteAsync( toBlockNumber : new BigInteger(2830145), cancellationToken : cancellationToken, startAtBlockNumberIfNotProcessed : new BigInteger(2830144)); Assert.Equal(2, context.Blocks.Count); Assert.Equal(2, context.Transactions.Count); Assert.Equal(4, context.TransactionLogs.Count); }
public async Task OneEvent() { const string INDEX_NAME = "transfer-logs"; //surround with "using" so that anything in a buffer is sent on dispose using (var azureSearchService = new AzureSearchService(AzureSearchServiceName, _azureSearchApiKey)) { try { //setup var index = await azureSearchService.CreateIndexForEventLogAsync <TransferEvent_ERC20>(INDEX_NAME); var indexer = azureSearchService.CreateIndexerForEventLog <TransferEvent_ERC20>(index.Name, documentsPerBatch: 1); var web3 = new Web3.Web3(BlockchainUrl); var blockchainProcessor = web3.Processing.Logs.CreateProcessor <TransferEvent_ERC20>((transfer) => indexer.IndexAsync(transfer)); var cancellationTokenSource = new CancellationTokenSource(); //execute await blockchainProcessor.ExecuteAsync(3146694, cancellationTokenSource.Token, 3146684); //assert await Task.Delay(5000); // allow time to index Assert.Equal(19, await azureSearchService.CountDocumentsAsync(INDEX_NAME)); } finally { await azureSearchService.DeleteIndexAsync(INDEX_NAME); } } }
public async Task <Address> HandleAsync(GetAddress query) { var web3 = new Web3.Web3("https://remote.akroma.io"); var balance = 0m; try { var block = await web3.Eth.GetBalance(query.Address); balance = block.Result; } catch { // ignored } var transactionCount = await _repository.GetAddressTransactionCountAsync(query.Address); var minedCount = await _repository.GetAddressMinedAsync(query.Address); var addressTo = await _repository.GetAddressToAsync(query.Address); var addressFrom = await _repository.GetAddressFromAsync(query.Address); return(new Address(query.Address, balance, minedCount, transactionCount, addressFrom.Count, addressFrom.Value, addressTo.Count, addressTo.Value)); }
public override async Task <JObject> ExecuteAsync(IClient client) { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var privateKey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7"; var abi = @"[{""constant"":false,""inputs"":[{""name"":""val"",""type"":""int256""}],""name"":""multiply"",""outputs"":[{""name"":""d"",""type"":""int256""}],""type"":""function""},{""inputs"":[{""name"":""multiplier"",""type"":""int256""}],""type"":""constructor""}]"; var byteCode = "0x60606040526040516020806052833950608060405251600081905550602b8060276000396000f3606060405260e060020a60003504631df4f1448114601a575b005b600054600435026060908152602090f3"; var multiplier = 7; var web3 = new Web3.Web3(new Account(privateKey), client); var receipt = await web3.Eth.DeployContract.SendRequestAndWaitForReceiptAsync(abi, byteCode, senderAddress, new HexBigInteger(900000), null, multiplier); var contract = web3.Eth.GetContract(abi, receipt.ContractAddress); var function = contract.GetFunction("multiply"); var transactionInput = function.CreateTransactionInput(senderAddress, null, null, 7); var signer = new LegacyTransactionSigner(); var nonce = await web3.Eth.Transactions.GetTransactionCount.SendRequestAsync(senderAddress); var signedTransaction = signer.SignTransaction(privateKey, transactionInput.To, 0, nonce.Value, LegacyTransaction.DEFAULT_GAS_PRICE, 900000, transactionInput.Data); var traceTransaction = new TraceRawTransaction(client); return(await traceTransaction.SendRequestAsync(signedTransaction.EnsureHexPrefix(), new[] { TraceType.vmTrace }, BlockParameter.CreateLatest())); }
public async Task ShouldBeAbleToDeployAContractUsingPersonalUnlock() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var password = "******"; var abi = @"[{""constant"":false,""inputs"":[{""name"":""val"",""type"":""int256""}],""name"":""multiply"",""outputs"":[{""name"":""d"",""type"":""int256""}],""type"":""function""},{""inputs"":[{""name"":""multiplier"",""type"":""int256""}],""type"":""constructor""}]"; var byteCode = "0x60606040526040516020806052833950608060405251600081905550602b8060276000396000f3606060405260e060020a60003504631df4f1448114601a575b005b600054600435026060908152602090f3"; var multiplier = 7; var web3 = new Web3.Web3(new ManagedAccount(senderAddress, password)); //assumed client is mining already var receipt = await web3.Eth.DeployContract.SendRequestAndWaitForReceiptAsync(abi, byteCode, senderAddress, new HexBigInteger(900000), null, multiplier); var contract = web3.Eth.GetContract(abi, receipt.ContractAddress); var multiplyFunction = contract.GetFunction("multiply"); var result = await multiplyFunction.CallAsync <int>(7); Assert.Equal(49, result); }
public async Task <Tuple <bool, DateTime> > DoesHashExistInTxn(Diploma_model diploma) { try { var web3 = new Web3.Web3(infuraURL); var result = await web3.Eth.Transactions.GetTransactionByHash.SendRequestAsync(diploma.transactionHash); var result2 = await web3.Eth.Blocks.GetBlockWithTransactionsByNumber.SendRequestAsync(result.BlockNumber); DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); dtDateTime = dtDateTime.AddSeconds((long)result2.Timestamp.Value).ToLocalTime(); if (result.Input.Contains(diploma.Hash)) { return(new Tuple <bool, DateTime>(true, dtDateTime)); } else { return(new Tuple <bool, DateTime>(false, DateTime.Now)); } } catch (Exception) { // does not exist return(new Tuple <bool, DateTime>(false, DateTime.Now)); } }
private async void BtnGetAccoutns_OnClick(object sender, RoutedEventArgs e) { var web3 = new Web3.Web3(); var accounts = await web3.Eth.Accounts.SendRequestAsync(); this.Dispatcher.Invoke(() => { txtAccounts.Text = string.Join(",", accounts); }); }
public async Task ShouldBeAbleCallAndReadEventLogs() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var password = "******"; var abi = @"[{'constant':false,'inputs':[{'name':'a','type':'int256'}],'name':'multiply','outputs':[{'name':'r','type':'int256'}],'type':'function'},{'inputs':[{'name':'multiplier','type':'int256'}],'type':'constructor'},{'anonymous':false,'inputs':[{'indexed':true,'name':'a','type':'int256'},{'indexed':true,'name':'sender','type':'address'},{'indexed':false,'name':'result','type':'int256'}],'name':'Multiplied','type':'event'}]"; var byteCode = "0x6060604052604051602080610104833981016040528080519060200190919050505b806000600050819055505b5060ca8061003a6000396000f360606040526000357c0100000000000000000000000000000000000000000000000000000000900480631df4f144146037576035565b005b604b60048080359060200190919050506061565b6040518082815260200191505060405180910390f35b60006000600050548202905080503373ffffffffffffffffffffffffffffffffffffffff16827f841774c8b4d8511a3974d7040b5bc3c603d304c926ad25d168dacd04e25c4bed836040518082815260200191505060405180910390a380905060c5565b91905056"; var multiplier = 7; var web3 = new Web3.Web3(); var unlockResult = await web3.Personal.UnlockAccount.SendRequestAsync(senderAddress, password, new HexBigInteger(120)); Assert.True(unlockResult); var transactionHash = await web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, new HexBigInteger(900000), multiplier); var receipt = await MineAndGetReceiptAsync(web3, transactionHash); var contractAddress = receipt.ContractAddress; var contract = web3.Eth.GetContract(abi, contractAddress); var multiplyFunction = contract.GetFunction("multiply"); var multiplyEvent = contract.GetEvent("Multiplied"); var filterAll = await multiplyEvent.CreateFilterAsync(); var filter7 = await multiplyEvent.CreateFilterAsync(7); transactionHash = await multiplyFunction.SendTransactionAsync(senderAddress, 7); transactionHash = await multiplyFunction.SendTransactionAsync(senderAddress, 8); receipt = await MineAndGetReceiptAsync(web3, transactionHash); var log = await multiplyEvent.GetFilterChanges<MultipliedEvent>(filterAll); var log7 = await multiplyEvent.GetFilterChanges<MultipliedEvent>(filter7); Assert.Equal(2, log.Count); Assert.Equal(1, log7.Count); Assert.Equal(7, log7[0].Event.MultiplicationInput); Assert.Equal(49, log7[0].Event.Result); }
public async Task ShouldBeAbleToDeployAContract() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var password = "******"; var abi = @"[{""constant"":false,""inputs"":[{""name"":""val"",""type"":""int256""}],""name"":""multiply"",""outputs"":[{""name"":""d"",""type"":""int256""}],""type"":""function""},{""inputs"":[{""name"":""multiplier"",""type"":""int256""}],""type"":""constructor""}]"; var byteCode = "0x60606040526040516020806052833950608060405251600081905550602b8060276000396000f3606060405260e060020a60003504631df4f1448114601a575b005b600054600435026060908152602090f3"; var multiplier = 7; var web3 = new Web3.Web3(); var unlockAccountResult = await web3.Personal.UnlockAccount.SendRequestAsync(senderAddress, password, new HexBigInteger(120)); Assert.True(unlockAccountResult); var transactionHash = await web3.Eth.DeployContract.SendRequestAsync(abi, byteCode, senderAddress, multiplier); var mineResult = await web3.Miner.Start.SendRequestAsync(6); Assert.True(mineResult); var receipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(transactionHash); while (receipt == null) { Thread.Sleep(5000); receipt = await web3.Eth.Transactions.GetTransactionReceipt.SendRequestAsync(transactionHash); } mineResult = await web3.Miner.Stop.SendRequestAsync(); Assert.True(mineResult); var contractAddress = receipt.ContractAddress; var contract = web3.Eth.GetContract(abi, contractAddress); var multiplyFunction = contract.GetFunction("multiply"); var result = await multiplyFunction.CallAsync<int>(7); Assert.Equal(49, result); }
public async Task ShouldBeAbleToEncodeDecodeComplexInputOutput() { var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var password = "******"; var abi = @"[{'constant':false,'inputs':[{'name':'key','type':'bytes32'},{'name':'name','type':'string'},{'name':'description','type':'string'}],'name':'StoreDocument','outputs':[{'name':'success','type':'bool'}],'type':'function'},{'constant':true,'inputs':[{'name':'','type':'bytes32'},{'name':'','type':'uint256'}],'name':'documents','outputs':[{'name':'name','type':'string'},{'name':'description','type':'string'},{'name':'sender','type':'address'}],'type':'function'}]"; var byteCode = "0x6060604052610659806100126000396000f360606040526000357c0100000000000000000000000000000000000000000000000000000000900480634a75c0ff1461004457806379c17cc5146100fe57610042565b005b6100e86004808035906020019091908035906020019082018035906020019191908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050909091908035906020019082018035906020019191908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509090919050506102c9565b6040518082815260200191505060405180910390f35b61011d600480803590602001909190803590602001909190505061025b565b6040518080602001806020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381038352868181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156101c65780601f1061019b576101008083540402835291602001916101c6565b820191906000526020600020905b8154815290600101906020018083116101a957829003601f168201915b50508381038252858181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156102495780601f1061021e57610100808354040283529160200191610249565b820191906000526020600020905b81548152906001019060200180831161022c57829003601f168201915b50509550505050505060405180910390f35b600060005060205281600052604060002060005081815481101561000257906000526020600020906003020160005b9150915050806000016000509080600101600050908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60006060604051908101604052806020604051908101604052806000815260200150815260200160206040519081016040528060008152602001508152602001600081526020015060606040519081016040528085815260200184815260200133815260200150905060006000506000868152602001908152602001600020600050805480600101828181548183558181151161049257600302816003028360005260206000209182019101610491919061037f565b8082111561048d57600060008201600050805460018160011615610100020316600290046000825580601f106103b557506103f2565b601f0160209004906000526020600020908101906103f191906103d3565b808211156103ed57600081815060009055506001016103d3565b5090565b5b5060018201600050805460018160011615610100020316600290046000825580601f1061041f575061045c565b601f01602090049060005260206000209081019061045b919061043d565b80821115610457576000818150600090555060010161043d565b5090565b5b506002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161037f565b5090565b5b5050509190906000526020600020906003020160005b8390919091506000820151816000016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061050357805160ff1916838001178555610534565b82800160010185558215610534579182015b82811115610533578251826000505591602001919060010190610515565b5b50905061055f9190610541565b8082111561055b5760008181506000905550600101610541565b5090565b50506020820151816001016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106105b657805160ff19168380011785556105e7565b828001600101855582156105e7579182015b828111156105e65782518260005055916020019190600101906105c8565b5b50905061061291906105f4565b8082111561060e57600081815060009055506001016105f4565b5090565b505060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff0219169083021790555050505060019150610651565b50939250505056"; var web3 = new Web3.Web3(); var unlockResult = await web3.Personal.UnlockAccount.SendRequestAsync(senderAddress, password, new HexBigInteger(120)); Assert.True(unlockResult); var transactionHash = await web3.Eth.DeployContract.SendRequestAsync(byteCode, senderAddress, new HexBigInteger(900000)); var receipt = await MineAndGetReceiptAsync(web3, transactionHash); var contractAddress = receipt.ContractAddress; var contract = web3.Eth.GetContract(abi, contractAddress); var storeFunction = contract.GetFunction("StoreDocument"); var documentsFunction = contract.GetFunction("documents"); transactionHash = await storeFunction.SendTransactionAsync(senderAddress, new HexBigInteger(900000), null, "key1", "hello", "solidity is great"); transactionHash = await storeFunction.SendTransactionAsync(senderAddress, new HexBigInteger(900000), null, "key1", "hello again", "ethereum is great"); receipt = await MineAndGetReceiptAsync(web3, transactionHash); var result = await documentsFunction.CallDeserializingToObjectAsync<Document>("key1", 0); var result2 = await documentsFunction.CallDeserializingToObjectAsync<Document>("key1", 1); Assert.Equal("hello", result.Name); Assert.Equal("solidity is great", result.Description); Assert.Equal("hello again", result2.Name); Assert.Equal("ethereum is great", result2.Description); }
public DaoService(Web3.Web3 web3, string address) { this.web3 = web3; this.contract = web3.Eth.GetContract(abi, address); }
public PublicResolverService(Web3.Web3 web3, string address) { this.web3 = web3; this.contract = web3.Eth.GetContract(ABI, address); }