Last active
November 25, 2019 16:06
-
-
Save anegg0/fbda730df99ceb244b18bd68fc09f1cf to your computer and use it in GitHub Desktop.
multiple balance outputs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Nethereum.Web3; | |
using Nethereum.ABI.FunctionEncoding.Attributes; | |
using Nethereum.Contracts.CQS; | |
using Nethereum.Util; | |
using Nethereum.Web3.Accounts; | |
using Nethereum.Hex.HexConvertors.Extensions; | |
using Nethereum.Contracts; | |
using Nethereum.Contracts.Extensions; | |
using Nethereum.RPC.Eth.DTOs; | |
using System; | |
using System.Numerics; | |
using System.Threading; | |
using System.Threading.Tasks; | |
public class GetStartedSmartContracts | |
{ | |
[FunctionOutput] | |
public class BalanceOfOutputDTO : IFunctionOutputDTO | |
{ | |
[Parameter("uint256", "balance", 1)] | |
public BigInteger Balance { get; set; } | |
} | |
//If we were going to return multiple values we could have something like: | |
[FunctionOutput] | |
public class BalanceOfOutputMultipleDTO : IFunctionOutputDTO | |
{ | |
[Parameter("uint256", "balance1", 1)] | |
public BigInteger Balance1 { get; set; } | |
[Parameter("uint256", "balance2", 2)] | |
public BigInteger Balance2 { get; set; } | |
[Parameter("uint256", "balance1", 3)] | |
public BigInteger Balance3 { get; set; } | |
} | |
[Function("balanceOf", "uint256")] | |
public class BalanceOfFunction : FunctionMessage | |
{ | |
[Parameter("address", "_owner", 1)] | |
public string Owner { get; set; } | |
} | |
public static async Task Main() | |
{ | |
// ### Instantiating Web3 and the Account | |
// To create an instance of web3 we first provide the url of our testchain and the private key of our account. | |
// Here we are using http://testchain.nethereum.com:8545 which is our simple single node Nethereum testchain. | |
// When providing an Account instantiated with a private key, all our transactions will be signed by Nethereum. | |
var url = "http://testchain.nethereum.com:8545"; | |
var privateKey = "0x7580e7fb49df1c861f0050fae31c2224c6aba908e116b8da44ee8cd927b990b0"; | |
var account = new Account(privateKey); | |
var web3 = new Web3(account, url); | |
//This is the contract bytecode (compile executable) and Abi | |
var contractByteCode = | |
"0x60606040526040516020806106f5833981016040528080519060200190919050505b80600160005060003373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005081905550806000600050819055505b506106868061006f6000396000f360606040523615610074576000357c010000000000000000000000000000000000000000000000000000000090048063095ea7b31461008157806318160ddd146100b657806323b872dd146100d957806370a0823114610117578063a9059cbb14610143578063dd62ed3e1461017857610074565b61007f5b610002565b565b005b6100a060048080359060200190919080359060200190919050506101ad565b6040518082815260200191505060405180910390f35b6100c36004805050610674565b6040518082815260200191505060405180910390f35b6101016004808035906020019091908035906020019091908035906020019091905050610281565b6040518082815260200191505060405180910390f35b61012d600480803590602001909190505061048d565b6040518082815260200191505060405180910390f35b61016260048080359060200190919080359060200190919050506104cb565b6040518082815260200191505060405180910390f35b610197600480803590602001909190803590602001909190505061060b565b6040518082815260200191505060405180910390f35b600081600260005060003373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060008573ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905061027b565b92915050565b600081600160005060008673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600050541015801561031b575081600260005060008673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060003373ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000505410155b80156103275750600082115b1561047c5781600160005060008573ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828282505401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a381600160005060008673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282825054039250508190555081600260005060008673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060003373ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828282505403925050819055506001905061048656610485565b60009050610486565b5b9392505050565b6000600160005060008373ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000505490506104c6565b919050565b600081600160005060003373ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600050541015801561050c5750600082115b156105fb5781600160005060003373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282825054039250508190555081600160005060008573ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828282505401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905061060556610604565b60009050610605565b5b92915050565b6000600260005060008473ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005060008373ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060005054905061066e565b92915050565b60006000600050549050610683565b9056"; | |
var abi = | |
@"[{""constant"":false,""inputs"":[{""name"":""_spender"",""type"":""address""},{""name"":""_value"",""type"":""uint256""}],""name"":""approve"",""outputs"":[{""name"":""success"",""type"":""bool""}],""type"":""function""},{""constant"":true,""inputs"":[],""name"":""totalSupply"",""outputs"":[{""name"":""supply"",""type"":""uint256""}],""type"":""function""},{""constant"":false,""inputs"":[{""name"":""_from"",""type"":""address""},{""name"":""_to"",""type"":""address""},{""name"":""_value"",""type"":""uint256""}],""name"":""transferFrom"",""outputs"":[{""name"":""success"",""type"":""bool""}],""type"":""function""},{""constant"":true,""inputs"":[{""name"":""_owner"",""type"":""address""}],""name"":""balanceOf"",""outputs"":[{""name"":""balance"",""type"":""uint256""}],""type"":""function""},{""constant"":false,""inputs"":[{""name"":""_to"",""type"":""address""},{""name"":""_value"",""type"":""uint256""}],""name"":""transfer"",""outputs"":[{""name"":""success"",""type"":""bool""}],""type"":""function""},{""constant"":true,""inputs"":[{""name"":""_owner"",""type"":""address""},{""name"":""_spender"",""type"":""address""}],""name"":""allowance"",""outputs"":[{""name"":""remaining"",""type"":""uint256""}],""type"":""function""},{""inputs"":[{""name"":""_initialAmount"",""type"":""uint256""}],""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""}]"; | |
// **** DEPLOYING THE SMART CONTRACT | |
// The solidity smart contract constructor for this standard ERC20 smart contract is as follows: | |
//function Standard_Token(uint256 _initialAmount) | |
//{ balances[msg.sender] = _initialAmount; | |
// _totalSupply = _initialAmount; | |
//} | |
//This means we need to supply a parameter to a constructor on deployment | |
var totalSupply = BigInteger.Parse("1000000000000000000"); | |
var senderAddress = account.Address; | |
//When working with untyped smart contract defintions the parameters are passed as part of a params object array, and recognised and map using the abi. | |
var receipt = await web3.Eth.DeployContract.SendRequestAndWaitForReceiptAsync(abi, | |
contractByteCode, senderAddress, new Nethereum.Hex.HexTypes.HexBigInteger(900000), null, totalSupply); | |
Console.WriteLine("Contract deployed at address: " + receipt.ContractAddress); | |
//Using our contract address we can interact with the contract as follows: | |
var contract = web3.Eth.GetContract(abi, receipt.ContractAddress); | |
//Using the contract we can retrieve the functions using their name. | |
var transferFunction = contract.GetFunction("transfer"); | |
var balanceFunction = contract.GetFunction("balanceOf"); | |
var newAddress = "0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe"; | |
//Using a CallAsyc we can query the smart contract for values | |
var balance = await balanceFunction.CallAsync<int>(newAddress); | |
Console.WriteLine($"Account {newAddress} balance: {balance}"); | |
Console.WriteLine("Transfering 1000 tokens"); | |
var amountToSend = 1000; | |
//Sending transactions will commit the information to the chain, before submission we need to estimate the gas (cost of the transaction) | |
//In a similar way any parameters required by the function are included at the end of the method in the same order as per the solidity function. | |
var gas = await transferFunction.EstimateGasAsync(senderAddress, null, null, newAddress, amountToSend); | |
var receiptAmountSend = | |
await transferFunction.SendTransactionAndWaitForReceiptAsync(senderAddress, gas, null, null, newAddress, | |
amountToSend); | |
balance = await balanceFunction.CallAsync<int>(newAddress); | |
Console.WriteLine($"Account {newAddress} balance: {balance}"); | |
var balanceOfFunctionMessage = new BalanceOfFunction() | |
{ | |
Owner = account.Address, | |
}; | |
var contractAddress = contract.Address; | |
var balanceHandler = web3.Eth.GetContractQueryHandler<BalanceOfFunction>(); | |
//var balance2 = await balanceHandler.QueryAsync<BigInteger>(contractAddress, balanceOfFunctionMessage); | |
balance = await balanceFunction.CallDeserializingToObjectAsync<BalanceOfOutputDTO>( balanceOfFunctionMessage, contractAddress); | |
//var balance = await balanceHandler.CallDeserializingToObjectAsync<BalanceOfOutputDTO>( balanceOfFunctionMessage, contractAddress); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment