Fundist API OneWallet v128
Fundist API OneWallet v128
Contents
Contents
Change History
1. Introduction to One Wallet
2. One Wallet Protocol Implementation Test
3. One Wallet Callback URL Prerequisites
4. Holistic Picture
5. Message Authentication
6. Number Format for amount and balance Fields.
7. Message Types
7.1 Ping
7.2 Get Balance
7.3 Debit from user account
7.4 Credit to user account
7.5. Rollback handling
7.6 Round Info
7.7 Win in the promotion
8. Response to Callback Request
8.1 Successful response
8.2. Error response
9. Test Scenarios
Change History
1 10 First official version of Fundist One Wallet protocol
. Feb
00 2014
1 4
. Oct
11 2017 Subtype of request is added for transaction cancellation cases. SDK temproraly excluded from the documentation.
1 17 Mandatory prerequisites for one wallet callback URL. Minor erratum corrections.
. Oct
12 2017
1 13 A note added regarding fields, being included for hash generation. Short description added to an “Error response” section
. Nov for case when player has lower balance, than amount on debit callback request. Added code samples for hmac generation
13 2017 on PHP and Java.
1 21 Added request and response examples, successful OW test example and test utility usage manual, CSharp hmac example,
. Jun zero credit and jacpotwin notes, game_extra description, HTTP code for success response.
15 2019
Updated i_gameid, i_actionid and i_gamedesc descriptions.
1 11 Description for HMAC generation for roundinfo callback has been introduced.
. Feb
16 2020
1 03 Additional requirements for callback endpoint are introduced.
. Mar
17 2020
1 15 Verification process for debit and credit requests extended by i_gameid, i_actionid parameters description.
. Feb
21 2021
1 18 Short description: "balance field must contain current value" is updated for debit and credit requests.
. Feb
22 2021
1 07 Added additional checking note related to the verification process debit and credit requests. The Rollback Handling
. Jul description is extended with i_gameid, i_actionid parameters.
25 2021
1 16 8.2. Error response paragraph is updated: parameter "balance" is added as a mandatory to response JSON message
. Aug
27 2022
In One Wallet implementation, there is a single wallet on Client's system side. Fundist.ORG system performs real-time requests to
credit and debit a single user's account in Client's system. Fundist.ORG performs requests to Client's system through HTTPS as JSON-
encoded object in POST data.
There is no concept of transaction rollback on protocol level. Instead, a standard credit request is sent to revert previous debit
operation. Such special credit requests can be identified by presence of “i_rollback” field, which holds “tid” of related debit.
Note: Client's system must never depend on i_extparam for validation of OneWallet requests
Response is expected as JSON-encoded object in HTTP response message body. Note: UTF-8 encoding is assumed, if non-ASCII
symbols are used.
For optimal performance, please configure HTTPS Keep-Alive of 120 seconds and enable SSL session caching.
Please rename OWClientTest_vN.M.safext before usage to OWClientTest_vN.M.jar. You can also use any name for JAR, please use this
name when you are going to run test util on command line. Hereinafter we use OWClientTest_v2.12.jar name for JAR file.
Launch example:
By running OWCLientTest without params, you can get list of parameters that might be provided for.
Example
separate domain, like callback.route56services.com, that is completely different from the casino domain,
different IP address like 112.34.78.103,
valid SSL certificate for callback service domain. Let's Encrypt free SSL certificate is allowed for use for callback service setup.
different domain registrars for main casino domain and callback service domain,
different SSL certificate authorities for main casino and callback service certificates.
Client's callback endpoint should respond to HTTP calls with the following types: GET/HEAD/POST. GET/HEAD types are used for initial
setup and monitoring. POST is used to send actual JSON callback messages.
In case endpoint is not available (domain has been expired, SSL certificate has been expired, etc) - it will be removed from
configuration with notification over email and optionally over other communication channel agreed in advance.
HTTPS protocol (HTTP with SSL certifcate) is allowed only when domain name is used with valid SSL certificate.
4. Holistic Picture
Player – user’s web browser
Note: Client's system must explicitly whitelist all Fundist.ORG IP addresses. All other IPs must be rejected. Please contact
eGamings support for actual list of outgoing IP addresses.
Example
{
"bbb" : "Val1",
"aaa" : "Val2",
"hmac" : "...."
}
{
"bbb" : "Val1",
"aaa" : "Val2",
"actions": [
{
"timestamp":"tmstmp1",
"actid":"ctd1",
"type":"tp1",
"i_actionid":"ctnd1",
"amount": "mnt1",
},
{
"timestamp":"tmstmp2",
"actid":"ctd2",
"type":"tp2",
"i_actionid":"ctnd2",
"amount": "mnt2",
}
],
"hmac" : "...."
}
Hashed value of HMAC secret should be returned in binary format, and not textual.
In order to keep protocol message extension safe, we recommend NOT TO make field list fixed, so in case new fields are introduced,
they are also included in generated hmac value.
The folowing HMAC secret key value is used for all examples
below: iexoocaquaenogoob7xoosaingeofoh9ighoh4eevoshaiNaN2gahHieYaix7iem
<?php
...
$hmac_key = hash("sha256", $hmac_secret, true);
ksort($message);
unset($message['hmac']);
if (array_key_exists('actions', $message)) {
$actions = $message['actions'];
$action_value = array();
foreach($actions as &$a) {
ksort($a);
$action_value[] = implode('', array_values($a));
}
unset($a);
$message['actions'] = implode('', $action_value);
}
Example in Java
...
final private synchronized String genHmac( String hmacSecret, JsonObject m ) throws Exception
{
SortedMap< String, JsonValue > kv = new TreeMap< String, JsonValue >();
kv.putAll(m);
final private Charset utf8_charset = Charset.forName( "UTF-8" );
// setup HMAC
MessageDigest md = MessageDigest.getInstance( "SHA-256" );
md.update( hmacSecret.getBytes( utf8_charset ) );
SecretKeySpec key = new SecretKeySpec( md.digest(), "HmacSHA256" );
...
private static String genHmac(String secret_key, Dictionary<string, dynamic> message)
{
SHA256 hash = new SHA256Managed();
Byte[] hash_secret = hash.ComputeHash(Encoding.UTF8.GetBytes(secret_key));
return hmac_value.ToLower();
}
...
Example in Nodejs
...
const crypto = require('crypto');
delete base.hmac;
if ('actions' in base) {
let actions = '';
for (const action of base.actions) {
Object.keys(action).sort().forEach(key => actions += action[key]);
}
base.actions = actions;
}
Examples:
"0.00"
"0.01"
"1.00"
"2.19"
7. Message Types
7.1 Ping
This request is used to check Client's system availability.
Request params:
Response params:
Example:
Example
Request:
{
"type":"ping",
"hmac":"855c54693a59a28a1039328ac5a12e9bcafab9f906fc935313e3a76db6376c56"
}
Response:
{
"status":"OK",
"hmac":"e969bada202f1735fedd074a5b1097e48080ef22d83fcbe74d86b0ceaa91bb63"
}
Note: Fundist.ORG uses this information is only for in-game display and basic bet amount check.
Request params:
Response params:
Example:
Example
Request:
{
"type":"balance",
"userid":"qauser_151238785931919_EUR",
"currency":"EUR",
"i_gamedesc":"998:roulette",
"i_extparam":"TestExtParam123",
"hmac":"173a74d4a43142426e05171465ef61668adeb14b1f9767e071296f3db994a299"
}
Response:
{
"status":"OK",
"balance":"2.87",
"hmac":"f2c90ef1954552707f160bd954e04b597cd22f6f60d61c3841ab9e272a9d4968"
}
Note: Parameter "tid" sent as Integer in JSON by default. In case you would like TID to be sent as String in test and production
environments, please inform integration team and they will add necessary setting to your project`s API.
i_gameid String Game round ID. Can be used to identify related transactions (credit+debit) – alphanumeric M
maxlen 32, there could be: several bets, several wins, no bets just win in one round
i_actionid String Game event reference ID (bet, win), technically can be duplicated among providers M
subtype String Used for transaction cancellation cases with “cancel” value or for specific games enter with O
“debit” value
*Overrides sending zero credits for losing bet. The param is disabled by default. For enabling contact Integration Team.
Response params:
Example
Request:
{
"type":"debit",
"userid":"qauser_151238785931919_EUR",
"currency":"EUR",
"tid":"1tid1566565638671",
"amount":"2.87",
"i_gameid":"1gm1566565638671",
"i_gamedesc":"998:roulette",
"i_actionid":"D11566565638920",
"i_extparam":"TestExtParam123",
"hmac":"3630609dad8806547985b6a88f49c0ed11101e064ac29c712e33a19f31da1d89"
}
Response:
{
"status":"OK",
"tid":"1tid1566565638671",
"balance":"0.00",
"hmac":"ad807d9e05ed238279766f33ec847b20e166fefae5e08d1237100f426bfc40d0"
}
1. Client's system must check, if request with the same "tid" has been performed before:
a. if any of essential fields ("type", "tid", "userid", "currency", "amount") mismatch:
return error "Transaction parameter mismatch"
b. if yes and response is known, return original response.
Note: "balance" field must contain current value, balance should not be debited by this transaction.
c. if yes and response is NOT known, fail with HTTP error “408 Request Timeout”
d. otherwise, continue
2. Client's system must check, if request with the same "i_gameid" and 'i_actionid' has been performed before:
a. if any of essential fields ("userid", "currency", "amount") mismatch:
return error "Transaction parameter mismatch
Note: type field can be different for requests with "subtype": "cancel"
b. if yes and response is known, return original response.
Note: "balance" field must contain current value, balance should not be debited by this transaction.
c. if yes and response is NOT known, fail with HTTP error “408 Request Timeout”
d. otherwise, continue
3. Check if currency matches user balance currency
a. Respond with error, if not
4. Perform in single DB transaction:
a. Check if user balance is greater or equal to requested amount
b. If the check is passed, decrease user balance by requested amount
c. If the check is NOT passed, fail with error
d. Store request and response in DB
e. Commit DB transaction
5. Send response message
a. Response must contain extra "tid" field of original request and current "balance" field.
Note: Client system must additionally check i_gameid and i_actionid parameters on rollback handling to avoid rollback
for the whole round instead of a single event.
7.4 Credit to user account
Request params:
Note: Parameter "tid" sent as Integer in JSON by default. In case you would like TID to be sent as String in test and production
environments, please inform integration team and they will add necessary setting to your project`s API.
i_gameid String Game round ID. Can be used to identify related transactions – alphanumeric maxlen 32, there M
could be: several bets, several wins, no bets just win in one round
game_extra String PageCode for Evo or FREEROUNDS_XXX(marks freeround win where XXX – TID of Freeround O
/Add transaction)
subtype String Used for transaction cancellation cases with "cancel" value or for specific games exit with O
“credit” value
jackpot_win Integer Possible value 1 - in case particular credit is connected with jackpot win, credit request will have O
extra parameter
Respose params:
Example:
Example
Request:
{
"type":"credit",
"userid":"qauser_151238785931919_EUR",
"currency":"EUR",
"tid":"1tid1566565638672",
"amount":"3.00",
"i_gameid":"1gm1566565638671",
"i_gamedesc":"998:roulette",
"i_actionid":"C11566565638920",
"i_extparam":"TestExtParam123",
"hmac":"66266a7c732b47f260087501a2e16327804d94ec0d7e15c36b812b26540298ef"
}
Response:
{
"status":"OK",
"tid":"1tid1566565638672",
"balance":"3.00",
"hmac":"834d81739bed3619df2abb958b0e918e712868b0792d38bd6db780a87a2b4947"
}
1. Client's system must check, if request with the same "tid" has been performed before:
a. if any of essential fields ( "type", "tid", "userid", "currency", "amount") mismatch:
return error "Transaction parameter mismatch"
b. if yes and response is known, return original response
Note: "balance" field must contain current value, balance should not be credited by this transaction.
c. if yes and response is NOT known, fail with HTTP error “408 Request Timeout”
d. otherwise, continue
2. Client's system must check, if request with the same "i_gameid" and 'i_actionid' has been performed before:
a. if any of essential fields ("userid", "currency", "amount") mismatch:
return error "Transaction parameter mismatch
Note: type field can be different for requests with "subtype": "cancel"
b.
2.
Note: Client system must additionally check i_gameid and i_actionid parameters on rollback handling to avoid rollback
for the whole round instead of a single event.
Optional feature: zero credit transactions can be turned on for your API, but please note that not all providers support this feature.
Optional feature: game_extra field is not sent by default, this could be enabled for your API.
7.5. Rollback handling
There are two types of rollback requests. Any rollback call should be performed for a single event related to the i_gameid and
i_actionid parameters.
1. In case of slow responses, duplicate request might be sent for example for bet in a game. When duplicate request is identified,
rollback call will be preformed. Type of such call is credit. JSON message will contain i_rollback field, that will contain a tid of
transaction, that should be rolled back and according player balance changes should be made.
Example:
debit call is sent with tid=124, that is being processed with timeout and/or proper response is not served.
debit call is sent with tid=124 for the same bet, this time request is processed quickly, correct response is served.
credit call will be sent with tid=125, and i_rollback=124.
Request params:
Note: Parameter "tid" sent as Integer in JSON by default. In case you would like TID to be sent as String in test and production
environments, please inform integration team and they will add necessary setting to your project`s API.
i_gameid String Game ID. Can be used to identify related transactions – alphanumeric M
maxlen 32
Response params:
Example:
Debit
Request:
{
"type":"debit",
"userid":"qauser_151238785931919_EUR",
"currency":"EUR",
"tid":"1tid1566565638688",
"amount":"0.03",
"i_gameid":"1gm1566565638674",
"i_gamedesc":"998:roulette",
"i_actionid":"D11566565645651",
"i_extparam":"TestExtParam123",
"hmac":"4321ddfd27f6d72cd2804834429a3111b4f7ad236d3f55aa4dce46f4fb215fa9"
}
Response:
{
"status":"OK",
"tid":"1tid1566565638688",
"balance":"2.87",
"hmac":"9b5a8a86996ceb3364c463d2abbb3c32958dd8e46f73a00a24a17f2523d152a0"
}
2. In case of slow responses game server might refuse bet settlement or winning for some reason and send cancellation request. Type
of such request also might be debit or credit. JSON message will contain “subtype” field with value “cancel”.
Request example:
Note: Parameter "tid" sent as Integer in JSON by default. In case you would like TID to be sent as String in test and production
environments, please inform integration team and they will add necessary setting to your project`s API.
i_gameid String Game ID. Can be used to identify related transactions – alphanumeric M
maxlen 32
subtype String Used for transaction cancellation cases with "cancel" value M
Response params:
Example:
Debit
Request:
{
"type":"debit",
"userid":"qauser_151238785931919_EUR",
"currency":"EUR",
"tid":"1tid1566565638694",
"amount":"0.25",
"i_gameid":"1gm1566565638674",
"i_gamedesc":"998:roulette",
"i_actionid":"D11566565645654",
"i_extparam":"TestExtParam123",
"hmac":"6b48a65e7f0cba1991df002f852e4c75b70da1565254c8cbf3eddb993d7765b5"
}
Response:
{
"status":"OK",
"tid":"1tid1566565638694",
"balance":"2.50",
"hmac":"0ba3811977f974d8dd65187b9801a4f5b6f10c8ecbd6d54eda23d99e908af3c1"
}
Debit cancellation
Request:
{
"type":"credit",
"userid":"qauser_151238785931919_EUR",
"currency":"EUR",
"tid":"1tid1566565638695",
"amount":"0.25",
"i_gameid":"1gm1566565638674",
"i_gamedesc":"998:roulette",
"subtype":"cancel",
"i_actionid":"D11566565645654",
"i_extparam":"TestExtParam123",
"hmac":"563c5e7aa25e35132f30d559671b1766d5a639b35eef4b2ecc854cbf73df97d9"
}
Response:
{
"status":"OK",
"tid":"1tid1566565638695",
"balance":"2.75",
"hmac":"7a9e9b42429df4400f2573517abf372efa843e6ecb7bb51fbc05919dd4db563f"
}
7.6 Round Info
Provide real-time round information after round is over (game name, user, activity, ext_param). Useful for bonus & loyalty analytics.
This request is re-sent until Client system responds with successful reply.
Request params:
Actions params:
Response params:
Example:
Request:
{
"type":"roundinfo",
"gameid":"15963851167",
"userid":"qauser_151238785931919_EUR",
"actions":[
{
"actid":"20445259420",
"type":"bet",
"amount":"10.00",
"timestamp":"2019-09-04 14:06:26"
}
],
"i_gamedesc":"998:roulette",
"hmac":"4dec9cd5a3f96cb83dff6104e841386d32e82b555de278c609ed1cfef0544be1"
}
Response:
{
"status":"OK",
"hmac":"e969bada202f1735fedd074a5b1097e48080ef22d83fcbe74d86b0ceaa91bb63"
}
7.7 Win in the promotion
Note: This information is relevant in case you have promotion module enabled.
This request is re-sent until Client system responds with successful reply.
Request params:
Respose params:
Example:
Request JSON message
Request:
{
"subtype":"promotion",
"i_bonusid":"2433",
"i_bonusdesc":"2783: promo test",
"type":"credit",
"tid":"64010",
"userid":"837",
"currency":"EUR",
"amount":"111.00",
"hmac":"306d729637b9fc7aa57dd1cfbe88516f78b6609c87ea8005976bf3b15425eddf"
}
Response:
{
"status":"OK",
"tid":"64010",
"balance":"211.00",
"hmac":"306d729637b9fc7aa57dd1cfbe88516f78b6609c87ea8005976bf3b15425eddf"
}
8. Response to Callback Request
Simple response
{
"status":"OK"
"hmac":"..."
}
Extended response
{
"error":"<specific_error_code>|Human readable description",
"balance":"..."
"hmac":"..."
}
Note: Only HTTP code 200 is assumed as positive, for all other HTTP response codes, even with JSON messsage, that contains
{"status":"OK",...} backend assumes, that request has failed and no positive response is received.
8.2. Error response
{
"error":"<specific_error_code>|Human readable description",
"balance":"..."
"hmac":"..."
}
Several specific error codes could be passed into a game in reply to one wallet debit callback. Licensee endpoint should reply with
JSON message {“error”:”<specific_code>”, "balance":"...", “hmac”: …} as described below.
SESSION_EXPIRED There has been a problem with the Live Casino. User authentication failed or your session may be
expired, please close the browser and try again.
TURNOVER_LIMIT_EXCEED This bet amount would exceed your personal limit within the specified period of time.
ED
SESSION_TIME_LIMIT_EXC Your play time exceeds your personal limit of time that may be played in a session.
EEDED
BET_LIMIT_EXCEEDED This bet amount would exceed your personal limit within the specified period of time.
LOSS_LIMIT_EXCEEDED This bet amount would exceed your personal limit within the specified period of time.
OWClientTest is performing standard test cases in 2 runs. All test cases are titled in square brackets. HMAC secret, used for these
examples: iexoocaquaenogoob7xoosaingeofoh9ighoh4eevoshaiNaN2gahHieYaix7iem
[ Debit 0.10 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.10","tid":11648727951747,"
i_gameid":"1gm1648727951746","i_gamedesc":"998:roulette","i_actionid":"D11648727952407","i_extparam":"
TestExtParam123","hmac":"d17c4c06f33b199f3b4a3efc6e35e9c9ffec34de267f1010bcf2a2dfa0f486ff"}
> Recv:{"status":"OK","tid":11648727951747,"balance":"2.90","hmac":"
84a566d9e98c2686cb9c48fc5b02d0a2bbf899361042fb34350162ba316a389c"}
> Time spent: 202ms
[ Debit 0.10 (repeat with new tid and the same game_id + i_actionid) ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.10","tid":11648727951748,"
i_gameid":"1gm1648727951746","i_gamedesc":"998:roulette","i_actionid":"D11648727952407","i_extparam":"
TestExtParam123","hmac":"79fe2946fcd5d09153617843ed269d5cddf65f3145e1b00eaee5c120acfee694"}
> Recv:{"status":"OK","tid":11648727951748,"balance":"2.90","hmac":"
e73901c939ba130251d6bac78c3fc79355fa58fd88d4d5dbfd8352c34624119f"}
> Time spent: 178ms
[ Debit 0.10 (one more repeat with new tid and the same game_id + i_actionid) ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.10","tid":11648727951749,"
i_gameid":"1gm1648727951746","i_gamedesc":"998:roulette","i_actionid":"D11648727952407","i_extparam":"
TestExtParam123","hmac":"9c76269ad960b4a34ceef3fd983ec3fefad4b9799864d4908ed55834b436c432"}
> Recv:{"status":"OK","tid":11648727951749,"balance":"2.90","hmac":"
03643aef77d9edfeaec77e6d3721ab2248f3e74099d3977dd8aa0f87dca9336d"}
> Time spent: 203ms
[ Credit 0.50 (for debit of 0.10) with new tid, i_gameid and i_actionid - are the same ]
---- Request:credit ----
> Sent:{"type":"credit","userid":"62447203ee621","currency":"EUR","amount":"0.50","tid":11648727951753,"
i_gameid":"1gm1648727951746","i_gamedesc":"998:roulette","i_actionid":"C11648727952407","i_extparam":"
TestExtParam123","hmac":"0b6a3fd78f85352fa0a908a1269f230d9296391cd459905ff3864d459b980e5c"}
> Recv:{"status":"OK","tid":11648727951753,"balance":"3.40","hmac":"
cde977fdfe49353a3efbda0c8ab0cddf23c8d6d9244e8a8f28a1510611e4b345"}
> Time spent: 176ms
---- Request:credit ----
> Sent:{"type":"credit","userid":"6244721467851","currency":"USD","amount":"0.50","tid":21648727951753,"
i_gameid":"2gm1648727951746","i_gamedesc":"998:roulette","i_actionid":"C21648727952407","i_extparam":"
TestExtParam123","hmac":"e107509a3d869fd72bee9d5240665293d5afca6e7a523c83a40b3bd438c00b1f"}
> Recv:{"status":"OK","tid":21648727951753,"balance":"3.40","hmac":"
7893024e29551d183ff2eaf5b5d7bb015c38c52cd9ef999d8704eb4d8c1f164f"}
> Time spent: 202ms
[ Debit 0.15 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.15","tid":11648727951754,"
i_gameid":"1gm1648727951746","i_gamedesc":"998:roulette","i_actionid":"D11648727952409","i_extparam":"
TestExtParam123","hmac":"a55b2a86eb474ea43348478a29c74b8b56c0604ecdd70d8b99d0e060638f9601"}
> Recv:{"status":"OK","tid":11648727951754,"balance":"3.25","hmac":"
d075740ec8a51add79dd5f1ea4f124befa4a12d883e020828fb37c37038f60b6"}
> Time spent: 209ms
[ Debit 0.50 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.50","tid":11648727951755,"
i_gameid":"1gm1648727951747","i_gamedesc":"998:roulette","i_actionid":"D11648727952410","i_extparam":"
TestExtParam123","hmac":"8078fe988183e4f4f61bafc78b377f5067b3929017fa1d612d37dd9c9d12beea"}
> Recv:{"status":"OK","tid":11648727951755,"balance":"2.75","hmac":"
3303596c1f3bf28e78f2be53f5a0e4a5f32619c650736c646da31a6503f96ff7"}
> Time spent: 227ms
[ Debit 0.25 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.25","tid":11648727951757,"
i_gameid":"1gm1648727951748","i_gamedesc":"998:roulette","i_actionid":"D11648727952411","i_extparam":"
TestExtParam123","hmac":"a147e60fb2374c4d585f8751930ac03a4b65971a3b342599251b5cb0bfd089d1"}
> Recv:{"status":"OK","tid":11648727951757,"balance":"2.50","hmac":"
03c2ba8eed04d7646351ade08fb829afd98f977360dca785b7073c287531f0ba"}
> Time spent: 246ms
[ Debit 0.25 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.25","tid":11648727951759,"
i_gameid":"1gm1648727951749","i_gamedesc":"998:roulette","i_actionid":"D11648727952412","i_extparam":"
TestExtParam123","hmac":"dd2112c5615260cfc257d63754c1d2e79c3c7a927bffc6ecc80abbe8a9f08a84"}
> Recv:{"status":"OK","tid":11648727951759,"balance":"2.50","hmac":"
565d7a78fc5ebb447aa31ba7ec6a65d0eaea748080daca4a1b5507817f0f652b"}
> Time spent: 218ms
[ Credit 0.50 ]
---- Request:credit ----
> Sent:{"type":"credit","userid":"62447203ee621","currency":"EUR","amount":"0.50","tid":11648727951760,"
i_gameid":"1gm1648727951749","i_gamedesc":"998:roulette","i_actionid":"C11648727952412","i_extparam":"
TestExtParam123","hmac":"091953001c3afb325c3968e92de9cf00cfce115d8dc135d04de6b123972b06ac"}
> Recv:{"status":"OK","tid":11648727951760,"balance":"3.00","hmac":"
6f1e8f4f57a53fa5b05206cf1d77e82751b35891204d41d752a67a27b677c4d7"}
> Time spent: 238ms
[ Debit 0.10 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.10","tid":11648727951764,"
i_gameid":"1gm1648727951751","i_gamedesc":"998:roulette","i_actionid":"D11648727963272","i_extparam":"
TestExtParam123","hmac":"d9d7bd952ddc6e9a24e948669fe9f1ad3003fedaf5550622d81e31ef61e35a07"}
> Recv:{"status":"OK","tid":11648727951764,"balance":"2.90","hmac":"
6e4229b941274a325a22aab011ff1ecd6737c6d81636e551b4d0d8d5e180d38a"}
> Time spent: 215ms
[ Debit 0.10 (repeat with new tid and the same game_id + i_actionid) ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.10","tid":11648727951765,"
i_gameid":"1gm1648727951751","i_gamedesc":"998:roulette","i_actionid":"D11648727963272","i_extparam":"
TestExtParam123","hmac":"ee580358fc12b3b83791c8993df94de8b57cc23516349971f15ab20cda7e8792"}
> Recv:{"status":"OK","tid":11648727951765,"balance":"2.90","hmac":"
7d58aaa76e8b7abec408714694a87968227f79772f822b872bbf0393be80fdce"}
> Time spent: 181ms
[ Credit 0.50 (for debit of 0.10) with new tid, i_gameid and i_actionid - are the same ]
---- Request:credit ----
> Sent:{"type":"credit","userid":"62447203ee621","currency":"EUR","amount":"0.50","tid":11648727951770,"
i_gameid":"1gm1648727951751","i_gamedesc":"998:roulette","i_actionid":"C11648727963272","i_extparam":"
TestExtParam123","hmac":"95d78d94b2a349a256364771f589399d4ce205242a2c24fc285a953cdf9e149a"}
> Recv:{"status":"OK","tid":11648727951770,"balance":"3.40","hmac":"
3f131cd4220b5baeee0555fd6a37a8a815425c7b2bb0b4ff2e20df4ad51bc461"}
> Time spent: 167ms
[ Debit 0.15 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.15","tid":11648727951771,"
i_gameid":"1gm1648727951751","i_gamedesc":"998:roulette","i_actionid":"D11648727963274","i_extparam":"
TestExtParam123","hmac":"56f5329e1be606afd8f2315c1e1cbe56e3c2c7f4bb2d7707061eb857de11e6fc"}
> Recv:{"status":"OK","tid":11648727951771,"balance":"3.25","hmac":"
df12c02f9a87baa67e83d524b104e16d09e34c7cc7cbebc6f90ebca209866171"}
> Time spent: 205ms
[ Debit 0.50 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.50","tid":11648727951772,"
i_gameid":"1gm1648727951752","i_gamedesc":"998:roulette","i_actionid":"D11648727963275","i_extparam":"
TestExtParam123","hmac":"979271b0a112fbaa9885f5958b719c6dec541606d8d27e9ffdb06ad69a257289"}
> Recv:{"status":"OK","tid":11648727951772,"balance":"2.75","hmac":"
dcee00ef0e1d303e7bc64db237df9c81674a93ecc2dc78f99256484af7f0bb98"}
> Time spent: 226ms
[ Debit 0.25 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.25","tid":11648727951774,"
i_gameid":"1gm1648727951753","i_gamedesc":"998:roulette","i_actionid":"D11648727963276","i_extparam":"
TestExtParam123","hmac":"068dddcc3b060d80cfa302bb33b5506678bf2909eed9c624da5b2a309824c317"}
> Recv:{"status":"OK","tid":11648727951774,"balance":"2.50","hmac":"
62181b1997ea6d4c8133fb3ecfd75273e78ad96702428373cecbe6fc28d2759e"}
> Time spent: 229ms
[ Debit 0.25 ]
---- Request:debit ----
> Sent:{"type":"debit","userid":"62447203ee621","currency":"EUR","amount":"0.25","tid":11648727951776,"
i_gameid":"1gm1648727951754","i_gamedesc":"998:roulette","i_actionid":"D11648727963277","i_extparam":"
TestExtParam123","hmac":"e5049d1420ba66e522891ea42b34021f2c9cd5edd6a91ea36edd9ec46a0beec2"}
> Recv:{"status":"OK","tid":11648727951776,"balance":"2.50","hmac":"
06e13b63a8058bc49a3e68c16f9c306fe3803aa98897f04544d3f72e39d0592c"}
> Time spent: 243ms
[ Credit 0.50 ]
---- Request:credit ----
> Sent:{"type":"credit","userid":"62447203ee621","currency":"EUR","amount":"0.50","tid":11648727951777,"
i_gameid":"1gm1648727951754","i_gamedesc":"998:roulette","i_actionid":"C11648727963277","i_extparam":"
TestExtParam123","hmac":"eee58264fd7369f711a83a039aea132fc81c9020c553b013220859e26f1c048a"}
> Recv:{"status":"OK","tid":11648727951777,"balance":"3.00","hmac":"
b4f1bd65b6ece784514c73a2d5e5247803f22127cec9bd2f218d6e96ed22e6be"}
> Time spent: 205ms
==============
===== OK =====