These are chat archives for Nethereum/Nethereum

20th
Jun 2018
Truong Dang Nghia
@DangNghia123_twitter
Jun 20 2018 02:26
@juanfranblanco hi, how can i send multiple transactions in same time, i have tried and getting error: replacement transaction underpriced
i want to tranfer eth from one address to multiple address in same time
Michael van der Veeken
@mvdv
Jun 20 2018 05:52
@ela4men_twitter : What are you trying to do? Are you invoking a contract method? What is your gas limit set to ?
Denis Tsai
@dt665m
Jun 20 2018 06:21
Hi all, I've been trying to start a fresh unity project with the current 2.4.0 nethereum but I'm having some issues figuring out the process
normally, I just compile a package to a DLL and add it to the unity plugins folder, but I'm having a hard time getting it to work
Denis Tsai
@dt665m
Jun 20 2018 06:34
is there a simple way to just import the whole source into unity? I can get the sample project to run fine, but I want to add nethereum to an existing project
ChinhP
@Chinh-P
Jun 20 2018 08:20
@DangNghia123_twitter All you have to do is using 1 instant of web3 to send all your transactions. By doing so, your nonce wont be duplicate and above error wont happen
Michael Ilchuk
@Ilchuk-Mihail
Jun 20 2018 08:31
@mvdv Yes. I see it.
But how to check address -> like this 0x97e69327842989697920299aFf631c5C667927bf
How to I need to use this functions. What? IsValidAddressLength or IsChecksumAddress
or both
https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Util/AddressUtil.cs
Enigmatic
@EnigmaticUnreal_twitter
Jun 20 2018 09:00

imho it's better to check for two things - is it a valid length, and if it is a proper hex address. If you'd want to perform a isCheckSumAddress, best to first run the address through ConvertToChecksumAddress - I did still came across a few exchanges/wallets which provides the address in a non-checksummed format.

Some sample for checking if hex, or you could use regex: Nethereum/Nethereum#293

Thinking out loud - ENS support would be cool. Hmmmmmmmm.
El Amen
@ela4men_twitter
Jun 20 2018 09:16
@mvdv Please am invoking a contract method. As a matter of fact the example am using to learn (https://www.vicompany.nl/magazine/start-with-blockchain-in-dotnetcore) did set gas only once during the release of the contract. I don't know if that has set the limit by default. I am researching how to set gas limit on contract method calls as well. Thank you
Michael Ilchuk
@Ilchuk-Mihail
Jun 20 2018 09:22
@EnigmaticUnreal_twitter
Clearly. I can use this function ? And it will cover all options ?
  public static bool IsValidAddress(string address)
        {
            Regex r = new Regex("^(0x){1}[0-9a-fA-F]{40}$");
            // Doesn't match length, prefix and hex
            if (!r.IsMatch(address))
                return false;
            // It's all lowercase, so no checksum needed
            else if (address == address.ToLower())
                return true;
            // Do checksum
            else
                return new AddressUtil().IsChecksumAddress(address);
        }
Enigmatic
@EnigmaticUnreal_twitter
Jun 20 2018 09:30
That function does look good since it ensures all input is hex, starting with 0x and length of 40, with checksum. Will be fine if you're checking address input.
Michael Ilchuk
@Ilchuk-Mihail
Jun 20 2018 09:33
or better to use IsValidAddressLength if true -> ConvertToChecksumAddress and IsChecksumAddress
if true -> address valid , else invalid
?
this // Do checksum
ConvertToChecksumAddress and AddressUtil().IsChecksumAddress(address);
Enigmatic
@EnigmaticUnreal_twitter
Jun 20 2018 09:42
I do like the IsValidAddress function above since it does check to see if the address is hex.
Michael van der Veeken
@mvdv
Jun 20 2018 10:39
@ela4men_twitter : You can (or should) set the gas limit for transactions. The default is 21000, which is usually not enough. There is a way to estimate the gas used by a transaction by using EthEstimateGas
El Amen
@ela4men_twitter
Jun 20 2018 10:43
@mvdv Thank you. I am using Truffle's Ganache and it seems their gas limit is hard coded to 6721975 but am researching how to increase that.
Michael van der Veeken
@mvdv
Jun 20 2018 10:43
That's already pretty high. Can you post the contract function you are invoking?
El Amen
@ela4men_twitter
Jun 20 2018 10:45
function addCoins(uint add) returns (uint b) {
b = balance + add;
return b;
}
@mvdv That's it please
Michael van der Veeken
@mvdv
Jun 20 2018 10:47
I'm not sure why you are hitting that gas limit, but a transaction (a function call that changes state) will not return a value
@ela4men_twitter : That must be the block gas limit, you still would have to specify a gas limit for the transaction
El Amen
@ela4men_twitter
Jun 20 2018 10:53
Yes I set 6721975 as my gas limit on the transaction
var gas = Web3.Convert.FromWei(await method.EstimateGasAsync(service.AccountAddress, null, null)); returns the same figure.
Zeshan Virk
@zeshanvirk
Jun 20 2018 11:13
how can i get list of trasactions of a contract(sent/recieve) for an address using Nethereum c# lib?
can anybody help on this issue?
Nethereum/Nethereum#360
Michael van der Veeken
@mvdv
Jun 20 2018 11:17
@zeshanvirk : What is the exception you are getting?
If you have 0 ETH you cannot pay for gas
Zeshan Virk
@zeshanvirk
Jun 20 2018 11:18
what if an address will have only ERC20 tokens only?
Michael van der Veeken
@mvdv
Jun 20 2018 11:18
@ela4men_twitter : That solidity function should not consume that much gas
@zeshanvirk You need eth to pay for gas
Zeshan Virk
@zeshanvirk
Jun 20 2018 11:18
how much eth?
Michael van der Veeken
@mvdv
Jun 20 2018 11:19
gasprice * gascost
Enigmatic
@EnigmaticUnreal_twitter
Jun 20 2018 11:19
@ela4men_twitter - Could you show us the code how you're doing the contract call? This is generally how I would do a contract call (VB), with some hardcoded values. You can use estimategas in turn though.
Dim gas As New HexBigInteger(80000)
Dim value As New HexBigInteger(0)

tokentransfer.SendTransactionAndWaitForReceiptAsync(account.Address, gas, value, , toAccount, numTokens)
Michael van der Veeken
@mvdv
Jun 20 2018 11:21
@ela4men_twitter : 80000 might not be enough gas. The transaction alone is 21000
@ela4men_twitter : But that function you posted should not consume that much gas
El Amen
@ela4men_twitter
Jun 20 2018 11:25
@EnigmaticUnreal_twitter public async Task<string> ExecuteContractff([FromRoute] string filename, [FromRoute] string contractMethod, [FromRoute] int value)
{
string contractAddress = await service.TryGetContractAddressFromFile(_env.WebRootPath + "\" + filename);
var contract = await service.GetContractFromFile(_env.WebRootPath + "\" + filename);
if (contract == null) throw new System.Exception("Contact not present in storage");
var method = contract.GetFunction(contractMethod);
try
{
// var result = await method.CallAsync<int>(value);
var gas = Web3.Convert.FromWei(await method.EstimateGasAsync(service.AccountAddress, null, null));
var result = await method.SendTransactionAsync(service.AccountAddress, value);
return result.ToString();
}
catch (Exception ex)
{
return "error";
}
}
That is how I was doing it but I will try @EnigmaticUnreal_twitter 's code. Thanks
Enigmatic
@EnigmaticUnreal_twitter
Jun 20 2018 11:29
Ah. You estimated the gas but you didn't use it. It's one of the overloads.
image.png

@dt665m @Aify

Might need @juanfranblanco to look at your issues. It's over my head at the moment. >_<

Juan Blanco
@juanfranblanco
Jun 20 2018 12:16
@dt665m have you tried
that includes the starter "template"
we need to add Unity3d to Continous integration
Zeshan Virk
@zeshanvirk
Jun 20 2018 12:18
@juanfranblanco how can i get list of transactions for a address with txDetail using nEthereum
Juan Blanco
@juanfranblanco
Jun 20 2018 12:18
you will need to use something like the BlockchainStorage
Zeshan Virk
@zeshanvirk
Jun 20 2018 12:21
isn't there any web3 method available that search for transaction on blockchain?
like bitcoin?
Juan Blanco
@juanfranblanco
Jun 20 2018 12:26
in parity you can use trace_filter
Zeshan Virk
@zeshanvirk
Jun 20 2018 12:26
i'm using geth
Juan Blanco
@juanfranblanco
Jun 20 2018 12:26
then use the transaction detail
Zeshan Virk
@zeshanvirk
Jun 20 2018 12:27
i'm using geth.
Juan Blanco
@juanfranblanco
Jun 20 2018 12:30
ethereum/go-ethereum#2104
@zeshanvirk
@Aify can you post some code sample and / or raise an issue?
Michael Ilchuk
@Ilchuk-Mihail
Jun 20 2018 12:37

I rewrite that function to this , and create simple extension

    public static class StringExtension
    {
        public static bool IsValidEthAddress(this string address)
        {
            Regex r = new Regex("^(0x){1}[0-9a-fA-F]{40}$");
            // Doesn't match length, prefix and hex
            if (!r.IsMatch(address))
                return false;
            // It's all lowercase, so no checksum needed
            else if (address == address.ToLower())
                return true;
            // Do checksum
            else
            {
               var addressUtil = new AddressUtil();
               var convertedAddress = addressUtil.ConvertToChecksumAddress(address);
               return addressUtil.IsChecksumAddress(convertedAddress);
            }
        }
    }

Everything is okay ?

Juan Blanco
@juanfranblanco
Jun 20 2018 12:58
When you all agree on the above feel free to do a pull request ;)
On address utils
Michael Ilchuk
@Ilchuk-Mihail
Jun 20 2018 14:02
Ok, I will do :smile:
I work with this library so I think I can add a lot of useful stuff.
Denis Tsai
@dt665m
Jun 20 2018 14:30
@juanfranblanco Yes, I was able to get that project to work. I also was able to copy the precompiled DLL's from the Plugins folder over to another project and also get it to work
Juan Blanco
@juanfranblanco
Jun 20 2018 14:31
nice :)
Denis Tsai
@dt665m
Jun 20 2018 14:31
but I do need to figure out how to build the latest version myself though
the "bleeding" edge version of unity is on newer .net and their new entity system conflicts with the System.Threading dll
included in the plugins
Juan Blanco
@juanfranblanco
Jun 20 2018 14:32
thanks please add an issue
and I will update it
Denis Tsai
@dt665m
Jun 20 2018 14:34
Will do. In the meantime, can you give me some pointers on building from source? I tried pulling source and doing a nuget restore but was running into a lot of compile issues
Juan Blanco
@juanfranblanco
Jun 20 2018 14:34
if you have installed visual studio in windows it should work out of the box
with Unity3d ;)
Enigmatic
@EnigmaticUnreal_twitter
Jun 20 2018 15:31

@Ilchuk-Mihail - I would think... If we already run the address through ConvertToChecksumAddress, the result will always be true when doing IsChecksumAddress.

So, I would imagine a simple return.address.IsChecksumAddress(address) being sufficient? So if everything is small letter we won't check, if there is one capital letter then we take the assumption that the address is checksummed and should be checked, therefore will run it through IsChecksumAddress.

Your thoughts?

Michael Ilchuk
@Ilchuk-Mihail
Jun 20 2018 15:44

@EnigmaticUnreal_twitter

Maybe.
Then code will stay in previous form

 public static class StringExtension
    {
        public static bool IsValidEthAddress(this string address)
        {
            Regex r = new Regex("^(0x){1}[0-9a-fA-F]{40}$");
            // Doesn't match length, prefix and hex
            if (!r.IsMatch(address))
                return false;
            // It's all lowercase, so no checksum needed
            else if (address == address.ToLower())
                return true;
            // Do checksum
            else
            {
               return new AddressUtil().IsChecksumAddress(address);
            }
        }
    }

But, need to test the addresses for testing it.
One more question:
Why for convenience AddressUtil wasn't made static class or string extension ?

Juan Blanco
@juanfranblanco
Jun 20 2018 15:47
it can be made ;)
Michael Ilchuk
@Ilchuk-Mihail
Jun 20 2018 15:54
I will try to make it if no one does not deny. In my opinion it is more user friendly :smile:
Juan Blanco
@juanfranblanco
Jun 20 2018 16:16
give me a second
ill post something
as a singleton
or static.. i am worry about upgradability
and breaking things..
Juan Blanco
@juanfranblanco
Jun 20 2018 16:27
The IsValidEthereumAddress is rather confusing
as actually any address is valid (theoretically if it can be derivide from the hash of the public address)
The ChecksumAddress is only for visual motivation
Aify
@Aify
Jun 20 2018 16:29
@juanfranblanco do you want me to post an MVCE?
Juan Blanco
@juanfranblanco
Jun 20 2018 16:29
so doing a check if is all lower before is checksum is rather confusing
@Aify what is an MVCE?
ok i searched
Aify
@Aify
Jun 20 2018 16:30
er, sorry, stack overflow lingo
Juan Blanco
@juanfranblanco
Jun 20 2018 16:30
well don't complicate youself just a snippet
will do
and later on i might need it :)
Aify
@Aify
Jun 20 2018 16:30
Give me a moment, I have the code open here
Aify
@Aify
Jun 20 2018 16:38
static async Task Main(string[] args)
{

    var gethWeb = new Web3("http://localhost:8545");


    await ERC20Test(gethweb);

    Console.WriteLine("Press any key to continue...");
    Console.ReadKey();
}


static async Task<TransactionReceipt> getTransactionReceipt(Web3 web3, string txnum)
{
    var rec = await web3.Eth.TransactionManager.TransactionReceiptService.PollForReceiptAsync(txnum);
    return rec;
}

static async Task ERC20Test(Web3 web3)
{
    await ScanBlockERC20(web3, 5000000);
}

static async Task ScanBlockERC20(Web3 web3, int bnum)
{
    var debug = new DebugApiService(web3.Client);
    TraceTransactionOptions ops = new TraceTransactionOptions();

    try
    {
        List<Task<string>> symtasks = new List<Task<string>>();
        List<Task<string>> nametasks = new List<Task<string>>();

        // get transaction receipts for everything
        List<TransactionReceipt> recs = await GetTransactionReceiptsFromBlock(web3, bnum);

        // Get list of names and symbols
        foreach (var r in recs)
        {
            if (r != null)
            {
                symtasks.Add(GetTokenSymbolFromReceipt(web3, r));
                nametasks.Add(GetTokenNameFromReceipt(web3, r));
            }
            else
            {
                Console.WriteLine("R is null");
            }
        }

        await Task.WhenAll(symtasks);
        await Task.WhenAll(nametasks);

        if (symtasks.Count != nametasks.Count)
        {
            Console.WriteLine("NAMECOUNT != SYMBCOUNT");
        }
        else
        {
            Console.WriteLine("GOOD COUNT");
            Task<String>[] ss = symtasks.ToArray();
            Task<String>[] nn = nametasks.ToArray();

            for (int i = 0; i < symtasks.Count; i++)
            {
                Console.WriteLine("Symbol & Name");
                Console.WriteLine(ss[i].Result);
                Console.WriteLine(nn[i].Result);
                Console.WriteLine("--------------------------");
            }
        }



    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }

}

static async Task<List<TransactionReceipt>> GetTransactionReceiptsFromBlock(Web3 web3, int bnum)
{
    List<TransactionReceipt> recs = new List<TransactionReceipt>();
    var block = await GetTransactionsFromBlock(web3, bnum);

    List<Task<TransactionReceipt>> tasks = new List<Task<TransactionReceipt>>();

    // loop through block
    foreach (var trans in block.Transactions)
    {
        var t = getTransactionReceipt(web3, trans.TransactionHash);
        tasks.Add(t);
    }

    await Task.WhenAll(tasks);

    foreach (Task<TransactionReceipt> t in tasks)
    {
        recs.Add(t.Result);
    }

    return recs;
}

static async Task<BlockWithTransactions> GetTransactionsFromBlock(Web3 web3, int bnum)
{
    var block = await web3.Eth.Blocks.GetBlockWithTransactionsByNumber.SendRequestAsync(new HexBigInteger(bnum));
    return block;
}

static async Task<String> GetTokenSymbolFromReceipt(Web3 web3, TransactionReceipt rec)
{
    try
    {

        if (rec.ContractAddress == null || rec.ContractAddress.Length == 0)
        {
            var contractHandler = web3.Eth.GetContractHandler(rec.ToAddress);
            var symbol = await contractHandler.QueryAsync<SymbolFunction, string>();

            return symbol;
        }
        else
        {
            var contractHandler = web3.Eth.GetContractHandler(rec.ContractAddress);
            var symbol = await contractHandler.QueryAsync<SymbolFunction, string>();

            return symbol;
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(rec.TransactionHash);
        Console.WriteLine(e);
        Console.WriteLine("====================");
        return "NULL";
    }
}

static async Task<String> GetTokenNameFromReceipt(Web3 web3, TransactionReceipt rec)
{
    try
    {
        if (rec.ContractAddress == null || rec.ContractAddress.Length == 0)
        {
            var contractHandler = web3.Eth.GetContractHandler(rec.ToAddress);
            var name = await contractHandler.QueryAsync<NameFunction, string>();

            return name;
        }
        else
        {
            var contractHandler = web3.Eth.GetContractHandler(rec.ContractAddress);
            var name = await contractHandler.QueryAsync<NameFunction, string>();

            return name;
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(rec.TransactionHash);
        Console.WriteLine(e);
        Console.WriteLine("====================");
        return "NULL";
    }
}
Juan Blanco
@juanfranblanco
Jun 20 2018 16:54
have you tried to get the name / symbol of the Dai directly?
Juan Blanco
@juanfranblanco
Jun 20 2018 17:48
right the issue is my fault as the name / symbol is not part of the interface standard i put strings instead of bytes32
[Function("name", "bytes32")]
public class NameFunction:ContractMessage
{
}
use this instead
and this
[Function("symbol", "bytes32")]
public class SymbolFunction:ContractMessage
{
}
for the time being
@Aify
hence the issue
Juan Blanco
@juanfranblanco
Jun 20 2018 18:21
@EnigmaticUnreal_twitter @Ilchuk-Mihail @StefH
I have added a "temporary" (needs refactoring) extension and singleton for AddressUtil
have a look and feedback is welcome
The part I don't understand is the IsValid
as a checksum address is just formatting
the same as lower case string
(although for comparisons is easier the lower case
Aify
@Aify
Jun 20 2018 18:41
I'll make the modifications and try it again to see if it breaks anything.
@juanfranblanco or do you mean that those hashes are not using ERC20 standard?
Enigmatic
@EnigmaticUnreal_twitter
Jun 20 2018 19:13

@juanfranblanco - After thinking about it a little... I would think the checksum part does not need to be part of the isValidAddress. What developers could do instead is call IsCheckSumAddress/ConvertToCheckSum from their code depending on their own use case.

I do think the regex is helpful. I personally have used it on the UI layer, also when I was reading .CSV for bulk operations. :)

Juan Blanco
@juanfranblanco
Jun 20 2018 19:14
yeah the regex is helpul
that is more in the line of IsValid
Also an extension for comparing addresses will be good
Aify
@Aify
Jun 20 2018 19:15
Do you think it's a good idea to modify the QueryAsync Function to possible check for overflow, and then try calling name/symbol fn wth bytes32 instead of string?
Juan Blanco
@juanfranblanco
Jun 20 2018 19:16
no..
Aify
@Aify
Jun 20 2018 19:16
lol
Juan Blanco
@juanfranblanco
Jun 20 2018 19:16
but yeah it is a tricky one
Aify
@Aify
Jun 20 2018 19:17
ERC20 does state name and symbol are optional, but even when they're optional they're designated as string
Juan Blanco
@juanfranblanco
Jun 20 2018 19:17
mainly if it is a bytes32 the string does not include the length
Aify
@Aify
Jun 20 2018 19:17
If we use bytes32, will it be able to capture regular strings then?
Juan Blanco
@juanfranblanco
Jun 20 2018 19:18
bytes32 is limited to 32
Aify
@Aify
Jun 20 2018 19:18
or will it just break the other way? Because it's working pretty haphazardly right now, but ideally we want to be able to catch both implementations, right?
Juan Blanco
@juanfranblanco
Jun 20 2018 19:18
historically there was no support for strings
Aify
@Aify
Jun 20 2018 19:18
Oof
Juan Blanco
@juanfranblanco
Jun 20 2018 19:18
so all the strings were bytes32
Aify
@Aify
Jun 20 2018 19:18
So basically, older contracts break code
Juan Blanco
@juanfranblanco
Jun 20 2018 19:18
not really
because they are bytes32
Aify
@Aify
Jun 20 2018 19:19
And Nethereum doesn't support bytes32 name/symbol tho
Juan Blanco
@juanfranblanco
Jun 20 2018 19:19
which is a generic byte array of fixed lenght
it does now as I have changed it
Aify
@Aify
Jun 20 2018 19:19
and it will still support regular strings
Juan Blanco
@juanfranblanco
Jun 20 2018 19:19
what happens is that the contract (is a new contract)
and the name / symbol are not part of the standard
so in the new contract are strings
but in older and probably more are bytes32
so the abi decoding gets interesting
Aify
@Aify
Jun 20 2018 19:20
Hm.
Juan Blanco
@juanfranblanco
Jun 20 2018 19:21
mainly different standards
but let me think about it in a generic way.. not in the overflow bit..
Aify
@Aify
Jun 20 2018 19:26
The problem is, now that you've changed the "string" to "bytes32"
it doesn't capture regular contracts
so running the same test on the same block
It doesn't properly capture VEX, which showed up before
Oh wait, it probably is capturing it, it's jsut not parsing it properly....
Juan Blanco
@juanfranblanco
Jun 20 2018 20:22
yeah it will be captured but not correctly
i have hacked somethign but it is a hack
as they are different types
and it is very smelly
mainly because the check is similar to what you have said
Aify
@Aify
Jun 20 2018 20:25
lol
Yea I was gonna make a hack for it locally too
Juan Blanco
@juanfranblanco
Jun 20 2018 20:25
which is validate the length
of the value
which as a bytes32 does not exist
Aify
@Aify
Jun 20 2018 20:25
I was just gonna duplicate SymbolFunction & NameFunction classes, and use bytes32 in those instead of string
Juan Blanco
@juanfranblanco
Jun 20 2018 20:25
so it will be very big
yeay
Aify
@Aify
Jun 20 2018 20:26
and then when i make the call to queryAsync, I can pass NameFunction2 if there's an exception from NameFunction
Juan Blanco
@juanfranblanco
Jun 20 2018 20:26
that is what I have done
yeah...
Aify
@Aify
Jun 20 2018 20:26
lol..
I couldn't think of a better way to do it on the fly
Juan Blanco
@juanfranblanco
Jun 20 2018 20:26
i think is nicer
Aify
@Aify
Jun 20 2018 20:26
Hacks will be hacks.
Juan Blanco
@juanfranblanco
Jun 20 2018 20:26
i have modify the decoder
etc check the length is bigger than the data
take into account that there can be many parameters
so it is pot luck
Aify
@Aify
Jun 20 2018 20:27
yea..
Juan Blanco
@juanfranblanco
Jun 20 2018 20:27
that a converting a string to a biginteger
results in a value bigger than whatever
so even if it works and I am going to remove it
Aify
@Aify
Jun 20 2018 20:28
hm.
Juan Blanco
@juanfranblanco
Jun 20 2018 20:28
it works.. but it may not work
that is the reason
Aify
@Aify
Jun 20 2018 20:28
Chance of failure
Mhm..
Anyways, at least you're aware of the issue now
Juan Blanco
@juanfranblanco
Jun 20 2018 20:29
yeah there an be to Name, Symbol functions
to == two
and take your pick
although another option for this would be to get the byte[]
which is far much better
and decode it base on the length
oh f** still the same problem
dynamic vs fixed
Aify
@Aify
Jun 20 2018 20:32
Simplicity is probably your best friend here
I would definitely just leave it with 2 different classes
SymbolStringFunction
SymbolBytes32Function
Juan Blanco
@juanfranblanco
Jun 20 2018 20:32
yep
Aify
@Aify
Jun 20 2018 20:34
Actually probably the Bytes32 function shouldn't be public
Juan Blanco
@juanfranblanco
Jun 20 2018 20:34
well people may use it for a specific contract
Aify
@Aify
Jun 20 2018 20:34
I wonder if there's a spot int he code where we could check for overflow exception
It's an ease of use thing
If it's set up so that you only need to cal lthe string version
and the string version will auto call the bytes32 version (if string fails)
then the api is easier to use
Juan Blanco
@juanfranblanco
Jun 20 2018 20:36
Well that will need to be implicit
Aify
@Aify
Jun 20 2018 20:36
I'm not sure what you mean by implicit
Juan Blanco
@juanfranblanco
Jun 20 2018 20:37
oh.. that the user will know that they are using that function
for that scenario
right i can do something like QueryRaw :)
to return the raw data
that is the solution (ish)
get the latest from CI
Aify
@Aify
Jun 20 2018 23:57
Thanks!