These are chat archives for Nethereum/Nethereum

13th
Feb 2018
doreegekku
@doreegekku
Feb 13 2018 02:44

Actually, I figured that bit out. I used the attribute header on each of the variables and stuff, but when I'm now getting this error:
IndexOutOfRangeException: Array index is out of range.
System.Numerics.BigInteger..ctor (System.Byte[] value)
Nethereum.ABI.Decoders.IntTypeDecoder.DecodeBigInteger (System.Byte[] encoded)
Nethereum.ABI.Decoders.IntTypeDecoder.DecodeInt (System.Byte[] encoded)
Nethereum.ABI.Decoders.BoolTypeDecoder.Decode (System.Byte[] encoded, System.Type type)
Nethereum.ABI.ABIType.Decode (System.Byte[] encoded, System.Type type)

my class has 2 bools and 8 uint256s, going to bools and bigints obviously.

zhuolaoshi
@zhuolaoshi
Feb 13 2018 03:58
~helle.I am used C# Web3 to connect ropsten,。 it toldme the ErrorStatusCode: 405, ReasonPhrase: 'Method Not Allowed' Why?
Juan Blanco
@juanfranblanco
Feb 13 2018 06:59
@doreegekku you can use the code generator to help. There is one the vscode solidity extension and one in the repo
@zhuolaoshi you are trying to use a method not supported in Infura
these methods are normally reserved for local clients
might be retrieving an account, of a filter
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:01
OH Thank u
I've solved the problem
That‘s problem of the account.
Juan Blanco
@juanfranblanco
Feb 13 2018 07:02
ok great :)
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:02
heee.. hey Juan Blance....Nice to meet u
Where r u come from? this is China
Juan Blanco
@juanfranblanco
Feb 13 2018 07:02
nice to meet you too :)
Spanish but living in the UK for a long time
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:03
ye? so did u speak Chinese?
Juan Blanco
@juanfranblanco
Feb 13 2018 07:03
I wish!
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:03
Or Cantonese?
Juan Blanco
@juanfranblanco
Feb 13 2018 07:03
neither.. :(
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:03
A ha
did u have the QQ ID?
Greatsamps
@Greatsamps
Feb 13 2018 07:04
You don't hear that often, people deciding to move TO the UK from Spain, normally the other way round!!
Juan Blanco
@juanfranblanco
Feb 13 2018 07:04
no i don't do QQ anymore, and yes that is right :) The weather is much nicer in Spain!
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:05
I very like the football team in Spain
Greatsamps
@Greatsamps
Feb 13 2018 07:05
my home office is only 20 metres from the house, had a lovely dash across to it this morning in the cold, dark rain :(
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:06
In China,u can see people used to more than 2 hours on the way to office....
Juan Blanco
@juanfranblanco
Feb 13 2018 07:06
I think the norm in London, might be sometimes 1:30 hours
Greatsamps
@Greatsamps
Feb 13 2018 07:07
and thats just the part of the journey on the tube :)
Juan Blanco
@juanfranblanco
Feb 13 2018 07:07
but those are extreme commutes
ha ha yes, the tube is a nightmare
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:07
I'm doing a cloud - end block chain project. Have anyone joined together? I can find VC
Greatsamps
@Greatsamps
Feb 13 2018 07:08
i used to live in London, but moved to Bath a few years ago.. very different pace of life!
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:08
If you see the subway in Beijing China, you will think your country is very happy
Juan Blanco
@juanfranblanco
Feb 13 2018 07:08
yeah, i live in Newcastle
so I guess similar
but nice weather in Bath
nicer*
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:09
You may be squeezed by a miscarriage in the subweay of BeiJing China..
Greatsamps
@Greatsamps
Feb 13 2018 07:09

i have a quick question actually. Can you let me know the best way to retrive all blocks since block x ? To clarify, i am writing a function to import some data off of the block chain into our DB. I am checking to see if the block number has changed, and if it has, i will then parse all blocks since the last one i have recored, block x.

what is the best way to get this range of blocks?

zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:09
he possibility of being squeezed out of pregnancy :)
Juan Blanco
@juanfranblanco
Feb 13 2018 07:10
ha ha yeah
Greatsamps
@Greatsamps
Feb 13 2018 07:10
haha yeah, i have some clients who visit China a lot, they have said its a different world!
bluuman
@bluuman
Feb 13 2018 07:12
thanks for the help Juan
you are the best
got Nethereum.Web3 working with my dotnet core project
mainly all transactions
nice one @bluuman
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:14
OK thank u @juanfranblanco , and I 'm going to work now~
Juan Blanco
@juanfranblanco
Feb 13 2018 07:14
me too :D
zhuolaoshi
@zhuolaoshi
Feb 13 2018 07:14
bye
Greatsamps
@Greatsamps
Feb 13 2018 07:14
Ok that is where i was heading, so i guess i need to just loop through all blocks in the range that i need calling this for each one?
Juan Blanco
@juanfranblanco
Feb 13 2018 07:15
yep
Greatsamps
@Greatsamps
Feb 13 2018 07:15
ok perfect, thanks for the help :)
Juan Blanco
@juanfranblanco
Feb 13 2018 07:15
but that is going to be expanded / refactored etc
Greatsamps
@Greatsamps
Feb 13 2018 07:16
ok that will help, i will have a dig
Juan Blanco
@juanfranblanco
Feb 13 2018 07:16
to do faster loads but also monitoring
for blocks etc
Greatsamps
@Greatsamps
Feb 13 2018 07:17
sounds good :)
Tech
@appxplore-tech
Feb 13 2018 07:24
hi, may i know that if this library can use for other cryptocurrency?
Juan Blanco
@juanfranblanco
Feb 13 2018 07:25
if is Ethereum based yes
not that Ether is a cryptocurrency as such
Tech
@appxplore-tech
Feb 13 2018 07:26
if it is a ETH based, we just need to change the network address and it shall done?
Juan Blanco
@juanfranblanco
Feb 13 2018 07:27
yes
Tech
@appxplore-tech
Feb 13 2018 07:31
Thanks for your notes, but how would this affect the flow?
sorry I'm too new to blockchain technology
Juan Blanco
@juanfranblanco
Feb 13 2018 07:32
oh it will be the same
like you said just change the network
but as a preventing measure don't use the same accounts
in different networks
to avoid replay attacks
Tech
@appxplore-tech
Feb 13 2018 07:35
oh i see. so it will be more secure with the implementation right?
Juan Blanco
@juanfranblanco
Feb 13 2018 07:35
yeah
Tech
@appxplore-tech
Feb 13 2018 07:35
may i know that if current version of Nethereum is safe to use for production?
Juan Blanco
@juanfranblanco
Feb 13 2018 07:35
yes it is
it is used in production
bluuman
@bluuman
Feb 13 2018 07:35
oh haha, i was using my ethereum account on the rinkeby net too
oops
Juan Blanco
@juanfranblanco
Feb 13 2018 07:36
well the replay attack will be a replay attack
so you will be doing the same transaction
in different networks
so if the receiver is the same
Tech
@appxplore-tech
Feb 13 2018 07:37
hmm... in that case, is there a roadmap on when this will be implemented? https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md
Juan Blanco
@juanfranblanco
Feb 13 2018 07:37
yes of course :D
it is in the roadmap
Tech
@appxplore-tech
Feb 13 2018 07:37
oh, if the receiver is different, then the replay attack shall not effectively executed , right?
Juan Blanco
@juanfranblanco
Feb 13 2018 07:37
no
mainly the same transaction
in different networks
Tech
@appxplore-tech
Feb 13 2018 07:38
Oh i see, thanks yeah :D
KinGGuN73
@KinGGuN73
Feb 13 2018 11:39
Hi
KinGGuN73
@KinGGuN73
Feb 13 2018 11:49
@juanfranblanco Can you help me please ? I search to convert "web3.Eth.Transactions.GetTransactionCount" HexBigInteger to a normal integer for increment it manualy for pushing many transactions at once in a loop.
Correct me if im wrong but "web3.Eth.Transactions.GetTransactionCount" don't mind about pending transactions, so my loop can't work as it try to replace the 1st transaction
Juan Blanco
@juanfranblanco
Feb 13 2018 11:51
HexBigInteger has a value
which is a BigInteger
you can cast it to an int
but the int might be too small so it will throw an error
regarding your nonces
check that
KinGGuN73
@KinGGuN73
Feb 13 2018 11:56
thank you !
im confused I just missed that
I should convert it to int64 so ?
Keep up the good work , this is awesome !
Juan Blanco
@juanfranblanco
Feb 13 2018 12:00
well I would just keep it a BigInteger
you can do the same operations
KinGGuN73
@KinGGuN73
Feb 13 2018 12:08
All is working perfectly , thank you for fast reply , have a good day :)
l-vitall
@l-vitall
Feb 13 2018 13:18

Hi, I have some issues with events retrieving with nethereum.
I created test contract to reproduce it:

pragma solidity 0.4.18;

contract EventsTest { 
  event BidAdded(address indexed sender, uint amount, string encryptedRate, uint time);
  event StateChanged(uint currentState, uint newState, uint time);
  //event StateChanged1(address sender, uint currentState);

    function EventsTest() public payable {
    }

    function () public payable { }

    function addBid() external payable {

        BidAdded(msg.sender, 3, "encRate", now);
        StateChanged(0, 1, now);
        //StateChanged1(msg.sender, 1);
    }
}

Below is c# code I used to access events:

 string contractAddress = "_pasle_it_here";
            string contractAbi = @"_pastle_it_here";

            var web3 = new Web3("http://localhost:8545");
            var contract = web3.Eth.GetContract(contractAbi, contractAddress);

            var filterInput = new NewFilterInput();
            filterInput.FromBlock = BlockParameter.CreateEarliest();
            filterInput.ToBlock = BlockParameter.CreateLatest();

            filterInput.Address = new[] { contract.Address };

            var stateChangedEventLog = contract.GetEvent("BidAdded");
            var logs = stateChangedEventLog.GetAllChanges<BidAdded>(filterInput).Result;

            var stateChangedEventLog = contract.GetEvent("StateChanged");
            var logs = stateChangedEventLog.GetAllChanges<StateChanged>(filterInput).Result;

Here are DTO objects:

 public class BidAdded
    {
        [Parameter("address", "sender", 1, true)]
        public string Sender { get; set; }

        [Parameter("uint", "amount", 2)]
        public BigInteger Amount { get; set; }

        [Parameter("string", "encryptedRate", 3)]
        public string EncryptedRate { get; set; }

        [Parameter("uint", "time", 4)]
        public ulong Time { get; set; }
    }

    public class StateChanged
    {
        [Parameter("uint", "currentState", 1)]
        public ulong CurrentState { get; set; }

        [Parameter("uint", "newState", 2)]
        public ulong NewState { get; set; }

        [Parameter("uint", "time", 3)]
        public ulong Time { get; set; }
    }

    public class StateChanged1
    {
        [Parameter("address", "sender", 1)]
        public string Sender { get; set; }

        [Parameter("uint", "currentState", 2)]
        public ulong CurrentState { get; set; }
    }

Issues and steps to reproduce them:

  1. Deploy contract withy truffle to clique and pastle its address and abi to c# code
  2. call 3 times addBid() contract method
  3. Runs c# code to get events
    • BidAdded event returned, but it contains extra records with null or empty fields
    • FAIL: StateChanged event fails to return with error "Index was outside the bounds of the array"
  4. Uncomment StateChanged1 event in contract and run all steps again from beginning
    • FAIL: BidAdded event fails to return now with error "InvalidOperationException: Sequence contains no elements"
  5. If I skip it on c# and try to get StateChanged1 events then it fails also with "Index was outside the bounds of the array" error (like at step 3)

Did I do something wrong? For this test there is no difference if I use BigInteger, ulong or int inside DTO objects.

Juan Blanco
@juanfranblanco
Feb 13 2018 14:05
@l-vitall when you say extra fields
what extra fields?
l-vitall
@l-vitall
Feb 13 2018 14:19
@juanfranblanco do you mean 'but it contains extra records '? For example I added 3 BidAdded event by calling addBid method, but there will be returned 4 - 6 events: 3 of mine and one or more of empty ones
Juan Blanco
@juanfranblanco
Feb 13 2018 14:34
yes i have seen that just now
Juan Blanco
@juanfranblanco
Feb 13 2018 14:41
ok
what is happening is that you are creating a filterinput wihout the context of the event
well mainly the event is expecting that you have created the filterInput
using event.CreateFilterInput
so when you pass as a parameter your dettached filter input it does not work,
well mainly it returns all the events for that contract
so you want something like this:
         var stateChangedEventLog1 = contract.GetEvent("BidAdded");
            var filterInput =
                stateChangedEventLog1.CreateFilterInput(new BlockParameter(1117), BlockParameter.CreateLatest());
            var logs = stateChangedEventLog1.GetAllChanges<BidAddedEventDTO>(filterInput).Result;

            var stateChangedEventLog = contract.GetEvent("StateChanged");
            var filterInput2 =
                stateChangedEventLog.CreateFilterInput(new BlockParameter(1117), BlockParameter.CreateLatest());
            var logs2 = stateChangedEventLog.GetAllChanges<StateChangedEventDTO>(filterInput2).Result;
nevertheles the event should recognise this
Juan Blanco
@juanfranblanco
Feb 13 2018 14:49
Nethereum/Nethereum#248
l-vitall
@l-vitall
Feb 13 2018 15:13
@juanfranblanco I see, thank you! May be it is worth to add some examples somewhere, the only ones I could find are located in Web3.Tests and Geth.Tests and both use 'new NewFilterInput()' syntax
Juan Blanco
@juanfranblanco
Feb 13 2018 15:14
yeah good point
ill add it to the workbooks list
Juan Blanco
@juanfranblanco
Feb 13 2018 15:32
Nethereum/Nethereum.Workbooks#7
She Jong Shon
@kkagill
Feb 13 2018 15:32
@juanfranblanco Huan, when does metamask intercept and opens up its window?
Juan Blanco
@juanfranblanco
Feb 13 2018 15:33
when you use sendTransaction
in javascript
She Jong Shon
@kkagill
Feb 13 2018 15:33
so var transactionHash = await fPlaceBet.SendTransactionAsync(tInput, fInput); in nethereum?
Juan Blanco
@juanfranblanco
Feb 13 2018 15:33
yeah..
Nethereum if you pass the right credentials (private key + Account) it will sign it for you
I also created Inteceptors
but it is eaiser this way
She Jong Shon
@kkagill
Feb 13 2018 15:35
passing right credentials..
at the moment i'm simply following your tutorial like
public async Task<Contract> DeployContract()
        {
            var senderAddress = "0x1e06f100f1b13d69d2edd9cec6ed53e3e6f66211";
            var password = "P@$$w0rd";
            var unlockAccountResult = await web3.Personal.UnlockAccount.SendRequestAsync(senderAddress, password, 1200);
            var mineResult = await web3.Miner.Start.SendRequestAsync(6);
            var receipt = await web3.Eth.DeployContract.SendRequestAndWaitForReceiptAsync(abi, byteCode, senderAddress, new HexBigInteger(3000000), null);
            var contractAddress = receipt.ContractAddress;
            return web3.Eth.GetContract(abi, contractAddress);
        }
and
Juan Blanco
@juanfranblanco
Feb 13 2018 15:37
Well that is if you want Geth to manage your account (or parity)
She Jong Shon
@kkagill
Feb 13 2018 15:38
var contract = await DeployContract();
            var fPlaceBet = contract.GetFunction("placeBet");
            object[] fInput = new object[] { ds.MatchId, ds.HomeTeamScore, ds.AwayTeamScore, ds.BettingPrice };
            var accounts = await web3.Eth.Accounts.SendRequestAsync();
            var tInput = new TransactionInput
            {
                From = accounts[0],
                Gas = new HexBigInteger(3000000),
                Value = new HexBigInteger(222)
            };

            var transactionHash = await fPlaceBet.SendTransactionAsync(tInput, fInput);
            var result = await fPlaceBet.CallAsync<bool>();

            return result;
Juan Blanco
@juanfranblanco
Feb 13 2018 15:38
Check the workbooks or accounts docs in readthedocs
She Jong Shon
@kkagill
Feb 13 2018 15:40
that doesn't intercept i mean.
what's wrong there
She Jong Shon
@kkagill
Feb 13 2018 16:04

read your docs and used below

account = new ManagedAccount(senderAddress, password);
web3 = new Web3Geth(account);

var contract = await DeployContract();
            var fPlaceBet = contract.GetFunction("placeBet");
            object[] fInput = new object[] { ds.MatchId, ds.HomeTeamScore, ds.AwayTeamScore, ds.BettingPrice };

            var tInput = new TransactionInput
            {
                From = account.Address,
                Gas = new HexBigInteger(3000000),
                Value = new HexBigInteger(222)
            };

            var transactionHash = await fPlaceBet.SendTransactionAsync(tInput, fInput);
            var result = await fPlaceBet.CallAsync<bool>();

            return result;

It just sends transaction without metamask being opened up.

Juan Blanco
@juanfranblanco
Feb 13 2018 16:05
what?
Nethereum does not open Metamask
She Jong Shon
@kkagill
Feb 13 2018 16:05
oh
Juan Blanco
@juanfranblanco
Feb 13 2018 16:06
Metamask is an addon for the browser
that manages your private keys and signs transactions from dapps
(well at the moment that is what it does)
later on it will do much more
She Jong Shon
@kkagill
Feb 13 2018 16:06
understand so if I want metamask to intercept and open up for transaction
I need to use javavscript code right?
Juan Blanco
@juanfranblanco
Feb 13 2018 16:07
yes or you just use
your private key and sign the transaction
She Jong Shon
@kkagill
Feb 13 2018 16:08
in nethereum?
Juan Blanco
@juanfranblanco
Feb 13 2018 16:08
yes
She Jong Shon
@kkagill
Feb 13 2018 16:09
what exactly is signing the transaction in nethereum?
snippets of code please?
Juan Blanco
@juanfranblanco
Feb 13 2018 16:09
read the account document
that explains what accounts are in Ethereum
it is rather important as it is the basis of
the blockhchain
mainly each transaction in the blockchain is signed
the signature is created using your private key
She Jong Shon
@kkagill
Feb 13 2018 16:11
yes I have those in my keystore folder
Juan Blanco
@juanfranblanco
Feb 13 2018 16:11
from your private key there is a public key and using the public key you can generate your address
correct
well those are store in metamask too
so each transaction that you send
it can be verified it belongs to your address
She Jong Shon
@kkagill
Feb 13 2018 16:12
yeah i read your doc and used managed account
and thought that it will open up metamask while doing transaction
Juan Blanco
@juanfranblanco
Feb 13 2018 16:12
and from there be able to send ether, execute smart contracts etc
no that managed account is the account that is managed by your ethereum client
like geth or parity
She Jong Shon
@kkagill
Feb 13 2018 16:13
ok
Juan Blanco
@juanfranblanco
Feb 13 2018 16:13
you just need a private key
at the lowest level
something like
She Jong Shon
@kkagill
Feb 13 2018 16:14
so if I do this
var password = "password";
var accountFilePath = @"c:\xxx\UTC--2015-11-25T05-05-03.116905600Z--12890d2cce102216644c59dae5baed380d84830c";
var account = Account.LoadFromKeyStoreFile(accountFilePath, string password);
and pass it as account.Address
and do transaction
it will do what i want?
Juan Blanco
@juanfranblanco
Feb 13 2018 16:14
check the workbook
She Jong Shon
@kkagill
Feb 13 2018 16:14
cuz that holds private key
ok
Juan Blanco
@juanfranblanco
Feb 13 2018 16:15
but yes if you store your private key in the KeyStore file
you can load your account that way
which mainly decrypts the file
and retrieves the key
She Jong Shon
@kkagill
Feb 13 2018 16:15
gotcha
i will load upp from keystore file
and try that and see if that opens up metamask
Juan Blanco
@juanfranblanco
Feb 13 2018 16:16
nothing opens metamask
jezz
:)
She Jong Shon
@kkagill
Feb 13 2018 16:16
or does that mean nethereum will just do metamask's task
instead
Juan Blanco
@juanfranblanco
Feb 13 2018 16:16
yeah
She Jong Shon
@kkagill
Feb 13 2018 16:16
damn got it now.
Juan Blanco
@juanfranblanco
Feb 13 2018 16:17
metamask does sign transactions
with your private keys stored (encrypted) in the browser
She Jong Shon
@kkagill
Feb 13 2018 16:17
correct
Juan Blanco
@juanfranblanco
Feb 13 2018 16:18
mainly if you are loading a keystore file
you are mainly retrieving the private key
She Jong Shon
@kkagill
Feb 13 2018 16:18
so it is really either using nethereum or using javascript code to open up metamask to do its transaction
Juan Blanco
@juanfranblanco
Feb 13 2018 16:18
and Nethereum does the signing
correct
mainly everything is signing transactions
She Jong Shon
@kkagill
Feb 13 2018 16:18
:clap:
Juan Blanco
@juanfranblanco
Feb 13 2018 16:19
there is also the encoding etc
but those are other things :)
She Jong Shon
@kkagill
Feb 13 2018 16:19
yeah thanks juan. I was using truffle and javascript + metamask mostly
and now jumped in to this world of nethereum
Juan Blanco
@juanfranblanco
Feb 13 2018 16:20
yeah it happens
She Jong Shon
@kkagill
Feb 13 2018 16:20
so if I only want to use nethereum to do its transaction
Juan Blanco
@juanfranblanco
Feb 13 2018 16:21
you just need your private key
She Jong Shon
@kkagill
Feb 13 2018 16:21
and when the anonymous user clicks on a button to transfer eth to another account
he has to input his address
in ui
correct?
Juan Blanco
@juanfranblanco
Feb 13 2018 16:21
well he will have to load his account first
but yeah
check that out
She Jong Shon
@kkagill
Feb 13 2018 16:22
oh cool
i will probably make UI to search for the user's keystore file and use it like var account = Nethereum.Web3.Accounts.Account.LoadFromKeyStoreFile(accountFilePath, string password);
She Jong Shon
@kkagill
Feb 13 2018 16:27
but your link is so useful
Juan Blanco
@juanfranblanco
Feb 13 2018 16:28
yes that covers many scenarios
(that was the idea, also the basis for a full reference application implementation)
She Jong Shon
@kkagill
Feb 13 2018 16:29
yes not sure what hd wallet is but all other features seem to be useful for my case
Juan Blanco
@juanfranblanco
Feb 13 2018 16:31
hd wallet allows you (in simple terms) to generate mulitple keys from the same seed
the seed can be a 12 word like metamask
She Jong Shon
@kkagill
Feb 13 2018 16:34
ok, i will search that up
thank you very much anyways. appreciate your effort
Jonathan Sheely
@jsheely
Feb 13 2018 18:07
Are there any RPC clients that support events / filters? Since Infura, which seems to the largest, does not. What do you guys do for events?
doreegekku
@doreegekku
Feb 13 2018 20:06
@juanfranblanco figured it out again. Looks like the BigInteger Constructor can't handle a bytearray of all 0s. Probably need to handle that somewhere. I just did the decoding by hand to get around it, and came across the same issue.
Jonathan Sheely
@jsheely
Feb 13 2018 22:27
So I switched from Infura (Ropsten) to a local geth client. And I'm getting "unknown account" on the same method that was working on Infura. This is probably a larger Ethereum question that I don't understand. What am I missing?
Jonathan Sheely
@jsheely
Feb 13 2018 23:03
Nevermind. I was dumb. and forgot to put my account in the Web3 overload
Jonathan Sheely
@jsheely
Feb 13 2018 23:10
Now it works except it's like it's working too fast. lol
I'm getting unknown transaction on SendTransactionAndWaitForReceiptAsync
However the transaction gets submitted and works. Gotta figure that one out
Jonathan Sheely
@jsheely
Feb 13 2018 23:45
Strange that I'm getting unknown transaction instead of just returning null and then the internal Polling retry logic should be doing its thing
Jonathan Sheely
@jsheely
Feb 13 2018 23:56
Guess that could be new in Geth 1.8.0 as a return result that the client isn't handling