Code Monkey home page Code Monkey logo

tezos-reward-distributor-organization / tezos-reward-distributor Goto Github PK

View Code? Open in Web Editor NEW
88.0 20.0 50.0 21.68 MB

Tezos Reward Distributor (TRD): A reward distribution software for tezos bakers.

Home Page: https://tezos-reward-distributor-organization.github.io/tezos-reward-distributor/

License: GNU General Public License v3.0

Python 99.95% Dockerfile 0.05%
tezos baking payment distribution cryptocurrency zeronet payout rewards staking

tezos-reward-distributor's Introduction

DISCLAIMER: TEZOS REWARD DISTRIBUTOR IS PROVIDED AS IS. IT IS UNDER CONSTANT DEVELOPMENT. EVENT THOUGH IT IS WELL TESTED, PLEASE USE IT WITH CARE. ALWAYS MAKE A PRE-RUN IN DRY MODE BEFORE MAKING ACTUAL PAYMENTS. IF YOU WANT TO RUN IN SERVICE MODE DO IT AFTER YOU ARE CONFIDENT WITH THE APPLICATION. IN SERVICE MODE ONLY UPDATE IF NEEDED.

PRIVACY: TEZOS REWARD DISTRIBUTOR COLLECTS ANONYMOUS STATISTICS. PLEASE READ OUR STATISTICS POLICY FOR MORE INFORMATION.

Tezos Reward Distributor: Run & Forget

Actions Status Documentation Status Stable Documentation Status

TRD is a software for distributing staking rewards of Tezos delegators, introduced in detail in this Medium article. This is not a script but a full scale application which can continuously run in the background as a Linux service. It can track cycles and make payments. However, it does not have to be used as a service, but it can also be used interactively.

The documentation can be found here.

You can also ask for support on the TRD channel of the Tezos-Baking Slack group, if you are a member of this group you can view the channel here, if you are not a member you can join the group and find the trd channel from the channel list or simply file an issue.

TRD supports complex payments, pays in batches, and supports three backends for calculations: Tezos RPC, TZPRO API and TzKT API. TRD is developed and tested extensively by the community.

Provider notes:

Blockwatch: TZPRO

The terms and conditions of TZPRO note that an account and API key are needed for the use of the API. Please review the pricing information. For further help contact [email protected] for more information.

In order to use your API key in the application add it to your configuration like tzpro_api_key: XXXXXXXXXX.

TzKT

The terms of use of TzKT API allow for commercial and non-commercial use.

TzKT API is free for everyone and for both commercial and non-commercial usage.

If your application or service uses the TzKT API in any forms: directly on frontend or indirectly on backend, you should mention that fact on your website or application by placing the label "Powered by TzKT API" with a direct link to tzkt.io.

Requirements and Setup

The setup instructions are Linux specific. Python 3 is required. You can use the following commands to install it.

sudo apt-get update
sudo apt-get -y install python3-pip

Download the application repository using git clone:

git clone https://github.com/tezos-reward-distributor-organization/tezos-reward-distributor

To install required modules, use pip with requirements.txt provided. Follow the instructions to create a virtual environment for your project specific python installation: https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/

python3 -m venv .venv
source .venv/bin/activate
cd tezos-reward-distributor
python3 -m pip install -r requirements.txt

To install the required modules for developers, use pip with requirements_developer.txt provided.

cd tezos-reward-distributor
python3 -m pip install -r requirements_developer.txt

Regularly check and upgrade to the latest available version:

git fetch origin #fetches new branches
git status #see the changes
git pull

Sample configuration

Before running TRD, you need to configure it by adding your baker's address and payout settings. The configuration file should be included in the ~/pymnt/cfg/ directory by default. You can use the following command to copy and modify the example configuration:

# create directory
mkdir -p ~/pymnt/cfg/
cp tezos-reward-distributor/examples/tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889.yaml ~/pymnt/cfg/
nano ~/pymnt/cfg/tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889.yaml

How to Run

For a list of parameters, read the online documentation, or run:

python3 src/main.py --help

The most common use case is to run in mainnet and start to make payments for the latest released rewards or continue making payments from the cycle after the last payment was done.

python3 src/main.py

TRD necessitates of an interface to get provided with income and delegator data in order to perform the needed calculations.

The default provider is the TzKT API. However, it is possible to change the data provider to a local node with the flag -P rpc. In this case, the default node would be 127.0.0.1:8732. In order to change the node URL for the provider, you can pass it in the form node_url:port using the flag -A (e.g. -P rpc -A 127.0.0.1:8733). Please note that the node should be an archive node, and that the port should be the RPC port specified while launching the node.

It is also possible to use a public RPC node with flag -P prpc, which defaults to https://mainnet.smartpy.io.

tezos-reward-distributor's People

Contributors

adamkittelson avatar amzid avatar andrewkishino avatar chiptus avatar dansan566 avatar decentralgabe avatar denver-s avatar dmirgaleev avatar dordille avatar ericlavoie avatar gracenoah avatar habanoz avatar jdsika avatar m-kus avatar nicolasochem avatar novalis avatar nurikabe avatar pea-io avatar pea-skillz avatar redref avatar rvermootenct avatar tezosland avatar twente-mining avatar utdrmac avatar vkresch avatar vlad1mir-d avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tezos-reward-distributor's Issues

More and better reports

Is there way to get more and better reports.. like maybe a json file where everything is stated like this, we can use this as for the dashboard:

"64": {
"delegators": {
"xx": {
"balance": "142380600",
"estimatedRewards": "191041",
"finalRewards": "191056"
}
},
"estimatedBakerRewards": {
"bondRewards": "15787731",
"feeRewards": "21226",
"looseRewards": "2",
"totalRewards": "15808959"
},
"estimatedTotalRewards": "16000000",
"fee": {
"denominator": 10,
"numerator": 1
},
"finalBakerRewards": {
"bondRewards": "15788989",
"feeRewards": "21228",
"looseRewards": "2",
"totalRewards": "15810219"
},
"finalTotalRewards": {
"estimatedDifference": "-1275",
"paid": "16001275",
"realized": "16001275",
"realizedDifference": "0"
},
"stakingBalance": "10732128232",
"stolenBlocks": []
},
"65": {
"delegators": {
"xx": {
"balance": "142380600",
"estimatedRewards": "71640",
"finalRewards": "71640"
}

also since the current system is working with tz1 accoount which needs to be topped out good, we need to know how much has to sit on the account would be great if we got report how much we need to pay for the delegees since there is 5 day frozen period and stuff this should easily be put in repor like

cycle xx payouts 666
cycle xx payouts 666
cycle xx payouts 666
cycle xx payouts 666

would be great if also you can specify including or excluding founder and deposit map

last but not least Sir Huseyin i think your doing fantastic job
do you accept donations, would love to donate for your efforts

Linux Service error

Running the sudo python3 service_add.py paymentaddress is printing the following error: Failed to enable unit: Unit file tezos-reward.service does not exist.
But the tezos-reward.service file is generated and inside the tezos-reward-distributor folder.

Set Freezecycle

Hello Sir,

sorry to spam the Github, but i see on mainpage github this,

freeze cycle: number of cycles rewards are kept frozen by the tezos network. Can be given negative values to let the application make future payments.

if i want to pay the delegees instant without 5 cycle freeze this valua should be -5 i assume?

Where would one define this value?, i looked around abit couldnt find it

Validate payment address at the beginnig

Too many errors reported because of misconfigured payment address. If application validates the payment address e.g. if private key is imported, signer used, error reports will decrese.

No payments unless there is at least one delegator

Expected behavior
I would expect bond holders to receive their rewards even if no one was delegating.

Environment

  • Source Code Build
  • Mainnet
  • Dry run test: $ python3 src/main.py -D -C 70 -M 2 -R -5 <account name>

How should the rounding behavior be in the case of 0 fee ?

Currently, payment amounts can have 3 decimal places. To achieve this, the payment amount is rounded down to 3 decimals.

This effectively means that the minimum payment amount is 1 milli-tezos. This also eventually sets an implicit minimum delegation amount. (You may calculate the amount of tezos needed to obtain rewards that are at least one milli-tezos.)

Event If fee ratio is 0 (either by setting standard_fee to 0 or adding an address to supporters_set), this policy is applied and the leftover amount is kept which creates the illusion of non-zero fee.

Let's discuss how should rounding policy be in the case of 0 fees.

Purpose of owners and bond map

Currently BusinessConfiguration.py looks like on the owner and founder map

owners_map={}
founders_map={}

i dont use bondpool or something like this
i have a baker service and i am the owner of the baker.. will i loose something if i leave it blank

getting errors sending payout

i am getting error payout

9-02-07 12:52:10,214 - main - DEBUG - producer - Checking for pending payments : payment_cycle <= current_cycle - (self.nw_config['NB_FREEZE_CYCLE'] + 1) - self.release_override
2019-02-07 12:52:10,214 - main - DEBUG - producer - Checking for pending payments : checking 68 <= 74 - (5 + 1) - 0
2019-02-07 12:52:10,214 - main - INFO - producer - Payment cycle is 68
2019-02-07 12:52:10,642 - main - INFO - producer - Total rewards=976.01381
2019-02-07 12:52:10,642 - main - INFO - consumer0 - Starting payments for cycle 68
2019-02-07 12:52:10,643 - main - INFO - producer - Reward created for cycle 68 address xxamount -3.866000 fee 4.510169 tz type D
2019-02-07 12:52:10,644 - main - INFO - producer - Reward created for cycle 68 address xx amount -0.528000 fee 0.615841 tz type D
2019-02-07 12:52:10,645 - main - INFO - producer - Reward creation done for cycle 68
2019-02-07 12:52:10,911 - main - DEBUG - consumer0 - Payment will be done in 1 batches
2019-02-07 12:52:10,911 - main - DEBUG - consumer0 - Payment of a batch started
2019-02-07 12:52:11,392 - main - DEBUG - consumer0 - head: branch xxcounter 12 protocol xx
2019-02-07 12:52:11,392 - main - DEBUG - consumer0 - Running 0 operations
2019-02-07 12:52:11,624 - main - DEBUG - consumer0 - Forging 0 operations
2019-02-07 12:52:11,856 - main - ERROR - consumer0 - Error at reward payment
Traceback (most recent call last):
File "/home/payment/xx/tezos-reward-distributor/src/pay/payment_consumer.py", line 70, in run
payment_logs = batch_payer.pay(payment_items, self.verbose, dry_run=self.dry_run)
File "/home/payment/xx/tezos-reward-distributor/src/pay/batch_payer.py", line 79, in pay
payments_log = self.pay_single_batch_wrap(payment_items_chunk, verbose=verbose, dry_run=dry_run)
File "/home/payment/xx/tezos-reward-distributor/src/pay/batch_payer.py", line 94, in pay_single_batch_wrap
return_code, operation_hash = self.pay_single_batch(payment_items, verbose, dry_run=dry_run)
File "/home/payment/xx/tezos-reward-distributor/src/pay/batch_payer.py", line 175, in pay_single_batch
bytes = parse_json_response(forge_command_response, verbose=verbose)
File "/home/payment/xx/tezos-reward-distributor/src/util/rpc_utils.py", line 16, in parse_json_response
raise Exception("Unknown client response format")
Exception: Unknown client response format

what can this be?

Cant payout from KT1 address

As reported making payment from KT1 fails.

i imported the unencrypted key with

./tezos-client import secret key unencrypted:

and after this i run

./tezos-client remember contract new src

both are in alias as show when run

./tezos-client list known contracts

yet i can only send with tz1 alias

also note that i figured out sending funds if the tz1 is not set as delegate it does give error, i just imported new key the tz1 didnt work after running this it worked (maybe handy to put into documentation)

./tezos-client register key tz1alias t as delegate

Compatibility to Baking Bad

Is your feature request related to a problem? Please describe.
Baking Bad is a service for delegators to compare rewards with actual received payments from the baker. For its calculations it uses 6 fractional digits for both owed rewards and percentage share of the total reward of the baker. Although both can be configured in tezos-reward-distributor (prcnt_scale : 6; pymnt_scale : 6), the actual received payments to delegators does not match with actual rewards, thus resulting in a message from Baking Bad that the payments are less or greater than expected.

Describe the solution you'd like
I have re-calculated the rewards to delegators as displayed by Baking Bad and can confirm that these match the actual rewards owed by bakers. There thus seems to be an issue in the calculations made by the tezos-reward-distributor. Calculations should be improved so that these match actual rewards up to 6 fractional digits.

baking_bad

payouts

Multiple instance support

Is your feature request related to a problem? Please describe.
Multiple instance support needed

Describe the solution you'd like
structure config directories according to baking address so that multiple instances can run simultaneously.

Setting supporters/specials to empty results in crash

Describe the bug
We have no supporters and no specials. So we set the parameter as empty.

supporters_set={}
specials_map={}
Traceback (most recent call last):
  File "src/main.py", line 413, in <module>
    main(args)
  File "src/main.py", line 311, in main
    full_supporters_set = supporters_set | set(founders_map.keys()) | set(owners_map.keys())
TypeError: unsupported operand type(s) for |: 'dict' and 'set'

To Reproduce
See above

Expected behavior
Expected the code to handle empty sets when there are no specials/supporters

Environment
6ec9f4c
alphanet
$ python36 src/main.py -D -N ALPHANET tz1LdZ6S8ScNMgaCLqrekDvbBWhLqtUebk23

Unrevealed addresses need to be revealed

Is your feature request related to a problem? Please describe.
Some users are not that before using an address for transactions it needs to be revealed. Users should be made aware.

Describe the solution you'd like
The application may check and instruct users to run reveal operation.

Describe alternatives you've considered
The application may transparently run reveal command, but it is better if users do it with awareness.

Signing Failure Errors

Is your feature request related to a problem? Please describe.
Maybe this is a feature request.

Updates to rounding configuration in #31 made dry run tests super clear. Thanks for that.

I finally went to run the reward-distributor (V2.1) for real, but it seems to fail silently when making payments. I gueeeesssss(?) this is because I would have to enter a password for my private key to sign the transactions.

Describe the solution you'd like
Would be helpful if the reward-distributor could somehow determine if it is able to sign transactions or, if not, show an appropriate error message.

Describe alternatives you've considered
Going to try running the signer. Wondering how other people are doing this? Are most running the signer, or living dangerously with unencrypted private keys?

Delegators always charged fee even if STANDARD_FEE=0.0

To Reproduce

  1. Set STANDARD_FEE=0.0 in BusinessConfiguration.py
  2. Dry run, eg python3 src/main.py -D -C 65 -M 2 -R -5 account_name
2019-01-31 02:50:39,029 - main - INFO - producer  - Reward created for cycle 67 address KT1 amount 0.039000 fee 0.000760 tz type D
2019-01-31 02:50:39,029 - main - INFO - producer  - Reward created for cycle 67 address tz1 amount 7.960000 fee 0.000000 tz type O
2019-01-31 02:50:39,030 - main - INFO - producer  - Reward created for cycle 67 address tz1 amount 0.000500 fee 0.000000 tz type F
2019-01-31 02:50:39,030 - main - INFO - producer  - Reward created for cycle 67 address tz1 amount 0.000500 fee 0.000000 tz type F

D fee is a small 0.000760 amount for some reason?

Payments to founders and owners show the expected zero fee.

Expected behavior

I assume delegators should also not have to pay a fee?

Environment

  • Source Build
  • Mainnet

FR: Remove dependency on tzscan

Describe the solution you'd like
All functionality of this application is dependent on tzscan.io. If tzscan is down, or inaccurate, or delayed, this tool carries the same issues.

Describe alternatives you've considered
This application should be using the local node's RPC-API to collect information.

Additional context
As of this posting, alpha.tzscan.io is incompatible with the new 003 protocol and is not showing accurate data. Because this application is dependent on data from tzscan, no testing using this app can happen at this time on alphanet.

Aggregation of founder and owner payments with the same address

Describe the bug
If same address is both founder and owner, two different transactions are done which means double transfer fee.
.
Expected behavior
Payments to the same address should be aggregated to a single payment. Reporting should remain separate.

Ability to make manual (on-demand) payments

Is your feature request related to a problem? Please describe.
It is good to be able to use the software as a payment application. It will be a good addition and it will make testing of the application easier.

Describe the solution you'd like
Payment data to be provided from the command line as an argument which will be parsed into a dict object. It is better not to over-user current main.py script. Addition of another script file named payfor.py is recommended.

Reports are needed, as well.

Update README for new users

The README does not give proper instructions to new users. The v3 migration is for users that are migrating and talks about creating the ~/pymnt/cfg/ directory. But the README does not discuss this. So new users (ie: non-migrating users) may be lost in setting up.

Payment reports under home directory

Is your feature request related to a problem? Please describe.
Payment reports should go under the home directory. They are better out of the code directory.

Describe the solution you'd like
If the user removes code payment reports should survive.

Split Code and Configuration

Is your feature request related to a problem? Please describe.
When BusinessConfiguration.py is updated, git pull causes problems.

Describe the solution you'd like
Use plain text configuration files e.g. ini,json,xml files to configure the application.

Describe alternatives you've considered
xml can be a good option because it can be validated. Json is more user-friendly. User recommendations are welcome.

Make ratio roundings configurable

Tested this tool and found an issue that payment amounts are slightly different from my own calculations. Then I dig into this issue and found that the reason is delegator's ratio rounding error. For example, one of my clients's share is 20.4401061108447% and cycle rewards is 474.382585 XTZ
But your tool rounds share to 20.44% and attempts to pay a little bit less - only 474.380121

So here are 2 questions:

  1. Maybe let's expose ratio rounding setting to the config?
    Default value could be 5, but personally I'd like to increase this value to let's say 10 so rewards payments will be more precise.

  2. As for now, is it enough to change ratio = round(balance / effective_delegate_staking_balance, 5) to let's say ratio = round(balance / effective_delegate_staking_balance, 10) in tzscan_rewards_calculator.py?

Transactions fail after python update

Describe the bug
After updating Ubuntu the Tezos Reward Distributor does not work any longer. I noticed that there was a python 3 update among the other updates, so the issue may be related to it.

This is what I get when running the software:

2019-03-06 14:44:48,184 - main - INFO - MainThread - --------------------------------------------
2019-03-06 14:44:48,184 - main - INFO - MainThread - BAKING ADDRESS is tz1โ€ฆ
2019-03-06 14:44:48,185 - main - INFO - MainThread - PAYMENT ADDRESS is payout
2019-03-06 14:44:48,185 - main - INFO - MainThread - --------------------------------------------
2019-03-06 14:44:48,185 - main - DEBUG - MainThread - Producer started
Traceback (most recent call last):
File "src/main.py", line 254, in
main(args)
File "src/main.py", line 149, in main
delegator_pays_xfer_fee=cfg.get_delegator_pays_xfer_fee())
File "/home/tezos/tezos-reward-distributor/src/pay/payment_consumer.py", line 40, in init
self.mm = EmailManager()
File "/home/tezos/tezos-reward-distributor/src/emails/email_manager.py", line 33, in init
if self.all_set(default):
File "/home/tezos/tezos-reward-distributor/src/emails/email_manager.py", line 40, in all_set
return default[USER] and default[PASS] and default[HOST] and default[PORT] and default[SENDER] and default[
File "/usr/lib/python3.6/configparser.py", line 1234, in getitem
return self._parser.get(self._name, key)
File "/usr/lib/python3.6/configparser.py", line 800, in get
d)
File "/usr/lib/python3.6/configparser.py", line 394, in before_get
self._interpolate_some(parser, option, L, value, section, defaults, 1)
File "/usr/lib/python3.6/configparser.py", line 444, in _interpolate_some
"found: %r" % (rest,))
configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: 'XXXXXXXX'
2019-03-06 14:44:53,612 - main - DEBUG - producer - Trying payments for cycle 77
2019-03-06 14:44:53,973 - main - DEBUG - producer - Checking for pending payments : payment_cycle <= current_cycle - (self.nw_config['NB_FREEZE_CYCLE'] + 1) - self.release_override
2019-03-06 14:44:53,973 - main - DEBUG - producer - Checking for pending payments : checking 77 <= 83 - (5 + 1) - 0
2019-03-06 14:44:53,973 - main - INFO - producer - Payment cycle is 77
2019-03-06 14:44:54,710 - main - INFO - producer - Total rewards=30.00276
2019-03-06 14:44:54,711 - main - INFO - producer - Reward created for cycle 77 address KT1โ€ฆ amount 10.004000 fee 0.526969 tz type D
2019-03-06 14:44:54,711 - main - INFO - producer - Reward created for cycle 77 address KT1โ€ฆ amount 0.000000 fee 0.000000 tz type D
2019-03-06 14:44:54,711 - main - INFO - producer - Reward created for cycle 77 address KT1โ€ฆ amount 19.471000 fee 0.000000 tz type O
2019-03-06 14:44:54,711 - main - INFO - producer - Reward creation done for cycle 77
2019-03-06 14:44:54,712 - main - INFO - producer - Run mode ONETIME satisfied. Killing the thread ...
2019-03-06 14:44:54,712 - main - INFO - producer - Producer returning ...
Exception ignored in: <module 'threading' from '/usr/lib/python3.6/threading.py'>
Traceback (most recent call last):
File "/usr/lib/python3.6/threading.py", line 1294, in _shutdown
t.join()
File "/usr/lib/python3.6/threading.py", line 1056, in join
self._wait_for_tstate_lock()
File "/usr/lib/python3.6/threading.py", line 1072, in _wait_for_tstate_lock
elif lock.acquire(block, timeout):
KeyboardInterrupt

Although the log states that the outputs were created that's not the case, as transfers have not been processed.

To Reproduce
Steps to reproduce the behavior:

python3 src/main.py -C 77 -M 3

Environment

  • Source Code Build
  • Chain mainnet

Better explanations for failed transactions

Is your feature request related to a problem? Please describe.
Extract errors from run operation command results. Users need interpretable information about a failed transaction.

Describe the solution you'd like
Run operation command is run before applying a transaction. Run operation may fail with a failure explanation. This explanation is not easily seen among all other log statements. It needs to be extracted and presented to the users.

Install instructions

Please provide install and setup instructions. What packages must be installed?

$ python main.py --help
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import _thread
ImportError: No module named _thread

V3 Specials ratio is broken

V3 specials_dict ratios are not used correctly. Whole calculations are messed up. Yielding negative payments. Negative payments are expected to be rejected. As a result, I do not expect any negative impact.

Please update asap.

Ability to ignore specific delegators

  • Feature Request *
    We have several KT1 addresses that delegate to us which are internal/testing addresses. We own/control these addresses. In some cases, we would prefer to not waste the txn fee by sending rewards to "ourselves".

Attempted to add these addresses to specials_map with fee of 100% but that produced a bunch of negative payout values.

  • Possible Solution *
    Adding an ignore_delegators array to BusinessConfiguration. Payouts are still calculated as normal but any address in this array is not added to the final batch operation.

calculation and payment error

there is a duplication in the counting, but he does not count small delegates at all. Moreover, the 61st cycle counts correctly. and from 62-67nd is bad. 68+ is good again.
another payment address was also tested, the result is the same.
double calculation: - https://ghostbin.com/paste/egdhb

UPD: file # tzscan_reward_api.py - (MAX_PER_PAGE = 50)

  • i changed to 150 and he is not trying to repeat the calculation in a circle.
    Now there is no double calculation. but apiTzScan itself counts only 50 accounts

Total reward in overview doesnt match payment overview

i haven't set any founder or deposit map, yet when i want to do payments, or see calculations i see this

2019-02-10 09:46:36,646 - main - INFO - producer - Total rewards=1326.0
2019-02-10 09:46:36,646 - main - INFO - producer - Reward created for cycle 75 address xx amount 73.756496 fee 5.551564 tz type D
2019-02-10 09:46:36,647 - main - INFO - producer - Reward created for cycle 75 address xx amount 0.641254 fee 0.048266 tz type D
2019-02-10 09:46:36,647 - main - INFO - producer - Reward created for cycle 75 address xxamount 0.086323 fee 0.006497 tz type D

can you maybe make script that if no founder or desposit map is set the total reward is calculated without them, would be more logical now i have to pay delegees like 74.5 xtz the total reward gives overview of 1326, now i can keep track if the delegees grow, you just want a number which is correct on your situation

Why is script listing known contracts?

When I view debug output, the script is calling list known contracts and list known addresses. Why is the script getting such information? Why does the script need to know about other addresses in my wallet? I'm not sending payments from any of these addresses, so why does the script need to know?

Exception

tz@tz:~/tezos-reward-distributor$ python3 src/main.py -C 34 -M 3 tz1 -D -V
2018-11-19 04:04:24,318 - main - INFO - MainThread - Tezos Reward Distributor is Starting
2018-11-19 04:04:24,318 - main - INFO - MainThread - Current network is MAINNET
2018-11-19 04:04:24,318 - main - INFO - MainThread - Baker address is tz1enYtbOh6w91Q665UfMfxK4YTโ€ฆ..
2018-11-19 04:04:24,318 - main - INFO - MainThread - Key name tz1
2018-11-19 04:04:24,319 - main - INFO - MainThread - --------------------------------------------
2018-11-19 04:04:24,319 - main - INFO - MainThread - Copyright Hรผseyin ABANOZ 2018
2018-11-19 04:04:24,319 - main - INFO - MainThread - [email protected]
2018-11-19 04:04:24,319 - main - INFO - MainThread - Please leave copyright information
2018-11-19 04:04:24,319 - main - INFO - MainThread - --------------------------------------------
2018-11-19 04:04:24,319 - main - INFO - MainThread - DRY RUN MODE
2018-11-19 04:04:24,319 - main - INFO - MainThread - --------------------------------------------
Not found /home/tz/tezos-client
2018-11-19 04:04:24,319 - main - DEBUG - MainThread - Client command is /home/tz/tezos/tezos-client
2018-11-19 04:04:24,319 - main - DEBUG - MainThread - Producer started
2018-11-19 04:04:24,320 - main - INFO - MainThread - If you want to send emails, populate email.ini file under current working directory.
2018-11-19 04:04:24,320 - main - DEBUG - MainThread - Consumer "consumer0" created
2018-11-19 04:04:30,338 - main - INFO - producer - Payment cycle is 34
2018-11-19 04:04:30,985 - main - INFO - producer - Total rewards=6.0
2018-11-19 04:04:30,985 - main - INFO - consumer0 - Starting payments for cycle 34
2018-11-19 04:04:30,987 - main - INFO - producer - Reward created for cycle 34 address KT1NZ3LtKRCwUsTCJQccMsY5a3o amount 1.785000 fee 0.135000 tz type D
2018-11-19 04:04:30,988 - main - INFO - producer - Reward created for cycle 34 address KT1B99nz7P38MTx783N7RxkBiTv amount 0.969000 fee 0.073980 tz type D
2018-11-19 04:04:30,989 - main - INFO - producer - Reward created for cycle 34 address KT19ZPyxt9qmLEo5i8NBFVJebi4e amount 0.200000 fee 0.015340 tz type D
2018-11-19 04:04:30,990 - main - INFO - producer - Reward created for cycle 34 address KT1JJ7Wdwk1b4ovoJ3JBAVQchEhR amount 0.175000 fee 0.000000 tz type O
2018-11-19 04:04:30,991 - main - INFO - producer - Reward created for cycle 34 address KT1FHwygopixxLRaBBngmShfTBww amount 0.186000 fee 0.000000 tz type O
2018-11-19 04:04:30,991 - main - INFO - producer - Reward created for cycle 34 address KT1JJ7Wdwk1b4ovoJ3JBAVQchEhs amount 0.123767 fee 0.000000 tz type F
2018-11-19 04:04:30,992 - main - INFO - producer - Reward created for cycle 34 address KT1FHwygopixxLRaBBngmShfTBws amount 0.131616 fee 0.000000 tz type F
2018-11-19 04:04:30,992 - main - INFO - producer - Reward creation done for cycle 34
2018-11-19 04:04:30,992 - main - INFO - producer - Run mode ONETIME satisfied. Killing the thread ...
2018-11-19 04:04:30,992 - main - INFO - producer - Producer returning ...
2018-11-19 04:04:31,602 - main - DEBUG - consumer0 - Payment will be done in 1 batches
2018-11-19 04:04:31,603 - main - DEBUG - consumer0 - Payment of a batch started
Command is |/home/tz/tezos/tezos-client rpc get http://127.0.0.1:8732/chains/main/blocks/head/context/contracts/tz1/counter|
Answer is ||
--- Logging error ---
Traceback (most recent call last):
File "/home/tz/tezos-reward-distributor/src/pay/payment_consumer.py", line 70, in run
payment_logs = batch_payer.pay(payment_items, self.verbose, dry_run=self.dry_run)
File "/home/tz/tezos-reward-distributor/src/pay/batch_payer.py", line 52, in pay
payments_log = self.pay_single_batch_wrap(payment_items_chunk, verbose=verbose, dry_run=dry_run)
File "/home/tz/tezos-reward-distributor/src/pay/batch_payer.py", line 67, in pay_single_batch_wrap
return_code, operation_hash = self.pay_single_batch(payment_items, verbose, dry_run=dry_run)
File "/home/tz/tezos-reward-distributor/src/pay/batch_payer.py", line 90, in pay_single_batch
counter = parse_json_response(send_request(self.comm_counter, verbose))
File "/home/tz/tezos-reward-distributor/src/util/rpc_utils.py", line 16, in parse_json_response
raise Exception("Unknown client response format")
Exception: Unknown client response format

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3.6/logging/init.py", line 993, in emit
msg = self.format(record)
File "/usr/lib/python3.6/logging/init.py", line 839, in format
return fmt.format(record)
File "/usr/lib/python3.6/logging/init.py", line 576, in format
record.message = record.getMessage()
File "/usr/lib/python3.6/logging/init.py", line 338, in getMessage
msg = msg % self.args
TypeError: not all arguments converted during string formatting
Call stack:
File "/usr/lib/python3.6/threading.py", line 884, in _bootstrap
self._bootstrap_inner()
File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/home/tz/tezos-reward-distributor/src/pay/payment_consumer.py", line 87, in run
logger.error("Error at reward payment", e)
Message: 'Error at reward payment'
Arguments: (Exception('Unknown client response format',),)
--- Logging error ---
Traceback (most recent call last):
File "/home/tz/tezos-reward-distributor/src/pay/payment_consumer.py", line 70, in run
payment_logs = batch_payer.pay(payment_items, self.verbose, dry_run=self.dry_run)
File "/home/tz/tezos-reward-distributor/src/pay/batch_payer.py", line 52, in pay
payments_log = self.pay_single_batch_wrap(payment_items_chunk, verbose=verbose, dry_run=dry_run)
File "/home/tz/tezos-reward-distributor/src/pay/batch_payer.py", line 67, in pay_single_batch_wrap
return_code, operation_hash = self.pay_single_batch(payment_items, verbose, dry_run=dry_run)
File "/home/tz/tezos-reward-distributor/src/pay/batch_payer.py", line 90, in pay_single_batch
counter = parse_json_response(send_request(self.comm_counter, verbose))
File "/home/tz/tezos-reward-distributor/src/util/rpc_utils.py", line 16, in parse_json_response
raise Exception("Unknown client response format")
Exception: Unknown client response format

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3.6/logging/init.py", line 993, in emit
msg = self.format(record)
File "/usr/lib/python3.6/logging/init.py", line 839, in format
return fmt.format(record)
File "/usr/lib/python3.6/logging/init.py", line 576, in format
record.message = record.getMessage()
File "/usr/lib/python3.6/logging/init.py", line 338, in getMessage
msg = msg % self.args
TypeError: not all arguments converted during string formatting
Call stack:
File "/usr/lib/python3.6/threading.py", line 884, in _bootstrap
self._bootstrap_inner()
File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/home/tz/tezos-reward-distributor/src/pay/payment_consumer.py", line 87, in run
logger.error("Error at reward payment", e)
Message: 'Error at reward payment'
Arguments: (Exception('Unknown client response format',),)
2018-11-19 04:04:32,227 - main - DEBUG - consumer0 - Exit signal received. Killing the thread...
2018-11-19 04:04:32,227 - main - INFO - consumer0 - Consumer returning ...
2018-11-19 04:04:35,326 - main - INFO - MainThread - Interrupted.
2018-11-19 04:04:35,326 - main - INFO - MainThread - --------------------------------------------------------
2018-11-19 04:04:35,326 - main - INFO - MainThread - Sensitive operations are in progress!
2018-11-19 04:04:35,326 - main - INFO - MainThread - Please wait while the application is being shut down!
2018-11-19 04:04:35,326 - main - INFO - MainThread - --------------------------------------------------------
tz@tz:~/tezos-reward-distributor$

minimum delegation ammount

do not pay reward if delegation amount less than delegation service set. example: if minimum delegation amount 1000 xtz. who delegate less don't get reward

Payment calculations pipeline

Is your feature request related to a problem? Please describe.
Current payment calculations are very simple. Not flexible enough to support different needs.

Describe the solution you'd like
A pipeline based calculation logic. At each stage certain calcuations are done. Easy to extend functionality by modifying right phase.
Phase 0: create payment data using a data source e.g. Tzscan api, in future node service rpc api.
Phase 1: exclude requested addresses, their reward goes to staking balance
Phase 2: exclude requested addresses, their reward goes to remaining participators (delegators, stake owners)
Phase 3: exclude requested addresses, their reward goes to founders. Calculate service fee for all delegators.
....

Additional context
New pipelined calculations architecture should help creating a better reporting.

Ability to calculate owners and founders share, but not actually pay it

Is your feature request related to a problem? Please describe.
I want to see how much I get from fees and baking separately, but do not provide payments to founders/owners - it's equals to paying to myself.

Describe the solution you'd like
Would be nice to have an ability to set calculate_only_owners_and_founders_rewards = true - show fees and baking rewards of the baker separately in calculations csv report, but do not create payments.

Negative reward delegee

i have 2 negative payement for one delegee of 66 and 67 (both negative)

xx D 0.000280 0.083440 10.000000 -0.751000 0.834440
xx D 0.000090 0.095851 7.000000 -0.576000 0.671851

prior these cycles i did maybe to much paying (because of testing purposes and since its small payments no worry)... now i decided to stick with the reward distributor.. does the reward distributor look into past payments and make the future ones negative?

calculation are base on Tzscan is this safe? like what if tzscan has bug and they add a 0 to the rewards, cant it be calculated based on the node?

Operation parsing error in prevalidation

Hi, I'm testing rewards in Zeronet and I have the error Operation parsing error in prevalidation on tezos_node on step applying command:

/opt/tezos-zeronet/bin/tezos-client -l rpc post http://127.0.0.1:8742/injection/operation with <str>

./src/BusinessConfiguration.py

# baker's bussiness parameters

# baker's 'tz' address, NOT A KT address
BAKING_ADDRESS = "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc"

# standard fee that is valid for everybody
STANDARD_FEE=0.045
# founders that shares the profits. map of founder payment address and share of the profit. Shares should sum up to 1.
founders_map={"tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6":1.0}
# deposit owners map of address and deposit ratio which must sum up to 1
owners_map={"KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT":1.0}
# no fee customers, e.g. founders, supporters
supporters_set={"KT1EVuZZmaPLSEt8C1Hg3uGB9fZrArBPSHKg"}
# customers with special rates. map of KT address and baking fee
specials_map={"KT1A8uPFEzVAYsaEVSbNr3aBECkfFWyq4SgD":0.01}

tezos_node log

Dec 16 23:20:06 tezos-stage tezos-zeronet[19515]: Dec 16 23:20:06 - prevalidator.NetXSzLHKwSum.ProtoALphaAL(1): injecting operation oozxdScrH5i7LNwdEpPiWKT8uD4EJMLfH5RK2A6Yzf9QMdUNSpi
Dec 16 23:20:06 tezos-stage tezos-zeronet[19515]: Dec 16 23:20:06 - prevalidator.NetXSzLHKwSum.ProtoALphaAL(1): Pushed: 2018-12-16T23:20:06Z, Treated: 2018-12-16T23:20:06Z, Failed: 2018-12-16T23:20:06Z
Dec 16 23:20:06 tezos-stage tezos-zeronet[19515]: Dec 16 23:20:06 - prevalidator.NetXSzLHKwSum.ProtoALphaAL(1): Operation parsing error in prevalidation.

tezos-reward-distributor full output

$ python3 src/main.py tezos_zero1 --executable_dirs /opt/tezos-zeronet/bin/ --node_addr 127.0.0.1:8742 -N ZERONET -C 697 -M 3 -V

2018-12-16 23:19:58,629 - main - INFO - MainThread - Tezos Reward Distributor is Starting
2018-12-16 23:19:58,629 - main - INFO - MainThread - Current network is ZERONET
2018-12-16 23:19:58,629 - main - INFO - MainThread - Baker address is tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc
2018-12-16 23:19:58,629 - main - INFO - MainThread - Key name tezos_zero1
2018-12-16 23:19:58,629 - main - INFO - MainThread - --------------------------------------------
2018-12-16 23:19:58,629 - main - INFO - MainThread - Copyright Huseyin ABANOZ 2018
2018-12-16 23:19:58,629 - main - INFO - MainThread - [email protected]
2018-12-16 23:19:58,629 - main - INFO - MainThread - Please leave copyright information
2018-12-16 23:19:58,629 - main - INFO - MainThread - --------------------------------------------
2018-12-16 23:19:58,630 - main - DEBUG - MainThread - Client command is /opt/tezos-zeronet/bin/tezos-client
2018-12-16 23:19:58,630 - main - DEBUG - MainThread - Producer started
2018-12-16 23:19:58,631 - main - INFO - MainThread - If you want to send emails, populate email.ini file under current working directory.
2018-12-16 23:19:58,631 - main - DEBUG - MainThread - Consumer "consumer0" created
2018-12-16 23:20:03,861 - main - DEBUG - producer  - Trying payments for cycle 697
2018-12-16 23:20:03,862 - main - DEBUG - producer  - Requesting http://api.zeronet.tzscan.io/v2/head
2018-12-16 23:20:03,933 - main - DEBUG - producer  - Response from tzscan is: {'proto': 1, 'timestamp': '2018-12-16T23:19:53Z', 'network': 'NetXSzLHKwSumh7', 'level': 90548, 'operations': [[]], 'predecessor_hash': 'BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX', 'data': '--', 'nb_operations': 8, 'signature': 'signMW1ikiGAVBtLxefRUvStV8Lucgm4dAgFsymozqayMfWqnLAethQLSBiKkMxgNESyuvGsfrg5CdQotVU34AsnkFcjs4ib', 'test_network': 'Not running', 'distance_level': 0, 'protocol': {'hash': 'ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK', 'name': 'ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK'}, 'commited_nonce_hash': '', 'fitness': '00 00000000002cf9d6', 'pow_nonce': 'ab020df00a8b9037', 'test_network_expiration': 'Not running', 'test_protocol': {'hash': 'ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK', 'name': 'ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK'}, 'priority': 0, 'baker': {'tz': 'tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889'}, 'volume': 0, 'fees': 0, 'hash': 'BLjJ47LiBBqZShBWAAFuXoPQQwTz55gvKuFHE6CdXE331CeGL6d', 'validation_pass': 4}
2018-12-16 23:20:03,933 - main - DEBUG - producer  - Checking for pending payments : payment_cycle <= current_cycle - (self.nw_config['NB_FREEZE_CYCLE'] + 1) - self.release_override
2018-12-16 23:20:03,933 - main - DEBUG - producer  - Checking for pending payments : checking 697 <= 707 - (5 + 1) - 0
2018-12-16 23:20:03,934 - main - INFO - producer  - Payment cycle is 697
2018-12-16 23:20:03,934 - main - DEBUG - producer  - Requesting http://api.zeronet.tzscan.io/v1/nb_delegators/tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc?cycle=697
2018-12-16 23:20:04,002 - main - DEBUG - producer  - Response from tzscan is [3]
2018-12-16 23:20:04,002 - main - DEBUG - producer  - Requesting http://api.zeronet.tzscan.io/v1/rewards_split/tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc?cycle=697&p=0&number=3
2018-12-16 23:20:04,128 - main - DEBUG - producer  - Response from tzscan is <Response [200]>
2018-12-16 23:20:04,129 - main - INFO - producer  - Total rewards=52.0
2018-12-16 23:20:04,130 - main - INFO - consumer0 - Starting payments for cycle 697
2018-12-16 23:20:04,135 - main - INFO - producer  - Reward created for cycle 697 address KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya amount 11.530000 fee 0.543360 tz type D
2018-12-16 23:20:04,135 - main - INFO - producer  - Reward created for cycle 697 address KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc amount 7.686000 fee 0.363080 tz type D
2018-12-16 23:20:04,135 - main - INFO - producer  - Reward created for cycle 697 address KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1 amount 7.686000 fee 0.363080 tz type D
2018-12-16 23:20:04,135 - main - INFO - producer  - Reward created for cycle 697 address KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT amount 23.828000 fee 0.000000 tz type O
2018-12-16 23:20:04,136 - main - INFO - producer  - Reward created for cycle 697 address tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6 amount 1.269999 fee 0.000000 tz type F
2018-12-16 23:20:04,136 - main - INFO - producer  - Reward creation done for cycle 697
2018-12-16 23:20:04,137 - main - INFO - producer  - Run mode ONETIME satisfied. Killing the thread ...
2018-12-16 23:20:04,137 - main - INFO - producer  - Producer returning ...
2018-12-16 23:20:04,342 - main - DEBUG - consumer0 - Payment will be done in 1 batches
2018-12-16 23:20:04,343 - main - DEBUG - consumer0 - Payment of a batch started
Command is |/opt/tezos-zeronet/bin/tezos-client rpc get http://127.0.0.1:8742/chains/main/blocks/head/context/contracts/tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc/counter|
Answer is |"86609"
|
Command is |/opt/tezos-zeronet/bin/tezos-client rpc get http://127.0.0.1:8742/chains/main/blocks/head|
Answer is |{ "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
  "chain_id": "NetXSzLHKwSumh7",
  "hash": "BLjJ47LiBBqZShBWAAFuXoPQQwTz55gvKuFHE6CdXE331CeGL6d",
  "header":
    { "level": 90548, "proto": 1,
      "predecessor": "BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX",
      "timestamp": "2018-12-16T23:19:53Z", "validation_pass": 4,
      "operations_hash":
        "LLoZd6PFYCWjx7q8okNHstZDRduwGfkDzHpZreFdHRYCfUWxSy8S9",
      "fitness": [ "00", "00000000002cf9d6" ],
      "context": "CoV2Tzv23mU8W476PDRZhMQzUk22p4dT4W9w4WDqrWuDdUuncSZC",
      "priority": 0, "proof_of_work_nonce": "ab020df00a8b9037",
      "signature":
        "signMW1ikiGAVBtLxefRUvStV8Lucgm4dAgFsymozqayMfWqnLAethQLSBiKkMxgNESyuvGsfrg5CdQotVU34AsnkFcjs4ib" },
  "metadata":
    { "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
      "next_protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
      "test_chain_status": { "status": "not_running" },
      "max_operations_ttl": 60, "max_operation_data_length": 16384,
      "max_block_header_length": 238,
      "max_operation_list_length":
        [ { "max_size": 32768, "max_op": 32 }, { "max_size": 32768 },
          { "max_size": 135168, "max_op": 132 }, { "max_size": 524288 } ],
      "baker": "tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889",
      "level":
        { "level": 90548, "level_position": 90547, "cycle": 707,
          "cycle_position": 51, "voting_period": 2,
          "voting_period_position": 25011, "expected_commitment": false },
      "voting_period_kind": "proposal", "nonce_hash": null,
      "consumed_gas": "0", "deactivated": [],
      "balance_updates":
        [ { "kind": "contract",
            "contract": "tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889",
            "change": "-512000000" },
          { "kind": "freezer", "category": "deposits",
            "delegate": "tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889", "level": 707,
            "change": "512000000" },
          { "kind": "freezer", "category": "rewards",
            "delegate": "tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889", "level": 707,
            "change": "16000000" } ] },
  "operations":
    [ [ { "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
          "chain_id": "NetXSzLHKwSumh7",
          "hash": "ooLp2mtRkqkMXG2yuMH67eEf3NPGemFYBzfFMFneXgzxafcdFKq",
          "branch": "BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX",
          "contents":
            [ { "kind": "endorsement", "level": 90547,
                "metadata":
                  { "balance_updates":
                      [ { "kind": "contract",
                          "contract": "tz1boot3mLsohEn4pV9Te3hQihH6N8U3ks59",
                          "change": "-448000000" },
                        { "kind": "freezer", "category": "deposits",
                          "delegate": "tz1boot3mLsohEn4pV9Te3hQihH6N8U3ks59",
                          "level": 707, "change": "448000000" },
                        { "kind": "freezer", "category": "rewards",
                          "delegate": "tz1boot3mLsohEn4pV9Te3hQihH6N8U3ks59",
                          "level": 707, "change": "14000000" } ],
                    "delegate": "tz1boot3mLsohEn4pV9Te3hQihH6N8U3ks59",
                    "slots": [ 25, 21, 16, 14, 10, 6, 3 ] } } ],
          "signature":
            "sigWs2bF79kvfvN7JmvF6M8UTUdKRdLWp7x1THE5gLtJ4z7XcREmWe6vpiWtQYk8JRK9S4dpX7QtpA7HQBj6W3zB37iZncLW" },
        { "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
          "chain_id": "NetXSzLHKwSumh7",
          "hash": "opDys1hhreQMyMqNiJgusM18oVqGaZFWX5DVTUEbxhwxUB2qhcT",
          "branch": "BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX",
          "contents":
            [ { "kind": "endorsement", "level": 90547,
                "metadata":
                  { "balance_updates":
                      [ { "kind": "contract",
                          "contract": "tz1boot2oCjTjUN6xDNoVmtCLRdh8cc92P1u",
                          "change": "-256000000" },
                        { "kind": "freezer", "category": "deposits",
                          "delegate": "tz1boot2oCjTjUN6xDNoVmtCLRdh8cc92P1u",
                          "level": 707, "change": "256000000" },
                        { "kind": "freezer", "category": "rewards",
                          "delegate": "tz1boot2oCjTjUN6xDNoVmtCLRdh8cc92P1u",
                          "level": 707, "change": "8000000" } ],
                    "delegate": "tz1boot2oCjTjUN6xDNoVmtCLRdh8cc92P1u",
                    "slots": [ 26, 17, 4, 2 ] } } ],
          "signature":
            "sigYXuCqc4sdD5pFr7V7dHEnTSt2uqaZLTLeMsRgApT2VcXVuGzVEQEBXKc4YYwpHkqmyLyuunzu38rssAa6RRUPNZ13iv81" },
        { "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
          "chain_id": "NetXSzLHKwSumh7",
          "hash": "op4ZnYgKA4CJWt5TJgWr3iVpdKVWB2T5NAEiEsnhJACDvFBJ9Xe",
          "branch": "BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX",
          "contents":
            [ { "kind": "endorsement", "level": 90547,
                "metadata":
                  { "balance_updates":
                      [ { "kind": "contract",
                          "contract": "tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889",
                          "change": "-192000000" },
                        { "kind": "freezer", "category": "deposits",
                          "delegate": "tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889",
                          "level": 707, "change": "192000000" },
                        { "kind": "freezer", "category": "rewards",
                          "delegate": "tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889",
                          "level": 707, "change": "6000000" } ],
                    "delegate": "tz1boot1pK9h2BVGXdyvfQSv8kd1LQM6H889",
                    "slots": [ 27, 20, 8 ] } } ],
          "signature":
            "sigRETjpoamoxpo1s2gM4aZErwkNzi3D3rSc1W7bd9ioLv1uWTvtbhM8jNUSyKJ1HKeRbMD6KbjF9vVjqSERqUq2FfDjPknE" },
        { "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
          "chain_id": "NetXSzLHKwSumh7",
          "hash": "oo2AqqGUu6o4FaPLyAWTnQFJRfC8EZXsQzR3TrWUMrvzs5JMbDS",
          "branch": "BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX",
          "contents":
            [ { "kind": "endorsement", "level": 90547,
                "metadata":
                  { "balance_updates":
                      [ { "kind": "contract",
                          "contract": "tz1aWXP237BLwNHJcCD4b3DutCevhqq2T1Z9",
                          "change": "-64000000" },
                        { "kind": "freezer", "category": "deposits",
                          "delegate": "tz1aWXP237BLwNHJcCD4b3DutCevhqq2T1Z9",
                          "level": 707, "change": "64000000" },
                        { "kind": "freezer", "category": "rewards",
                          "delegate": "tz1aWXP237BLwNHJcCD4b3DutCevhqq2T1Z9",
                          "level": 707, "change": "2000000" } ],
                    "delegate": "tz1aWXP237BLwNHJcCD4b3DutCevhqq2T1Z9",
                    "slots": [ 30 ] } } ],
          "signature":
            "sighQ73qWtFYm8w8E1THsZp2ipqUsnRmyRc4szLSqZrBTpvF4qvJLHRhBo6gRBuUioU6bvVLS5BHeexjRUaomSc5spvuYTn5" },
        { "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
          "chain_id": "NetXSzLHKwSumh7",
          "hash": "opEc6k7eeiQbhUz1ZGgPckdiakzz5U58GSM2kXpEfHndN4iG6P2",
          "branch": "BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX",
          "contents":
            [ { "kind": "endorsement", "level": 90547,
                "metadata":
                  { "balance_updates":
                      [ { "kind": "contract",
                          "contract": "tz1fyvFH2pd3V9UEq5psqVokVBYkt7rHTKio",
                          "change": "-128000000" },
                        { "kind": "freezer", "category": "deposits",
                          "delegate": "tz1fyvFH2pd3V9UEq5psqVokVBYkt7rHTKio",
                          "level": 707, "change": "128000000" },
                        { "kind": "freezer", "category": "rewards",
                          "delegate": "tz1fyvFH2pd3V9UEq5psqVokVBYkt7rHTKio",
                          "level": 707, "change": "4000000" } ],
                    "delegate": "tz1fyvFH2pd3V9UEq5psqVokVBYkt7rHTKio",
                    "slots": [ 9, 1 ] } } ],
          "signature":
            "sigmVVEvg1YVN5C23oHRhkWg4ZXpioMZRLoF1NyRHWkzZGW7b7xj7VcRQzRXUJ6HmmSat5UsMkWwUUKcqSs13M8vUqn3ka4K" },
        { "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
          "chain_id": "NetXSzLHKwSumh7",
          "hash": "oo7MmXvn8NZRTzSb8Xwy1oHget3h8W53mW9mMtRaRoxPKh992UR",
          "branch": "BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX",
          "contents":
            [ { "kind": "endorsement", "level": 90547,
                "metadata":
                  { "balance_updates":
                      [ { "kind": "contract",
                          "contract": "tz1SkbPvfcqUXbs3ywBkAKFDLGvjQawLXEKZ",
                          "change": "-128000000" },
                        { "kind": "freezer", "category": "deposits",
                          "delegate": "tz1SkbPvfcqUXbs3ywBkAKFDLGvjQawLXEKZ",
                          "level": 707, "change": "128000000" },
                        { "kind": "freezer", "category": "rewards",
                          "delegate": "tz1SkbPvfcqUXbs3ywBkAKFDLGvjQawLXEKZ",
                          "level": 707, "change": "4000000" } ],
                    "delegate": "tz1SkbPvfcqUXbs3ywBkAKFDLGvjQawLXEKZ",
                    "slots": [ 15, 11 ] } } ],
          "signature":
            "sigSedwommvGjHjWxgKZN2fG3cQ8vCf9ucjyv5jTM77hyV5RU6yUEpHC7z3CwQDP9cyDhLGBSo9DhpsDPUWW966J7qb1KyND" },
        { "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
          "chain_id": "NetXSzLHKwSumh7",
          "hash": "oomi57Aqevg4hMwNDophKn74xfxgSB3GoN9MFBeohLdvbSPFtp6",
          "branch": "BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX",
          "contents":
            [ { "kind": "endorsement", "level": 90547,
                "metadata":
                  { "balance_updates":
                      [ { "kind": "contract",
                          "contract": "tz3Q67aMz7gSMiQRcW729sXSfuMtkyAHYfqc",
                          "change": "-576000000" },
                        { "kind": "freezer", "category": "deposits",
                          "delegate": "tz3Q67aMz7gSMiQRcW729sXSfuMtkyAHYfqc",
                          "level": 707, "change": "576000000" },
                        { "kind": "freezer", "category": "rewards",
                          "delegate": "tz3Q67aMz7gSMiQRcW729sXSfuMtkyAHYfqc",
                          "level": 707, "change": "18000000" } ],
                    "delegate": "tz3Q67aMz7gSMiQRcW729sXSfuMtkyAHYfqc",
                    "slots": [ 29, 28, 23, 22, 19, 13, 7, 5, 0 ] } } ],
          "signature":
            "sigqtcmH7TCLa2wD5WRPTrEYufovpSiFZCwnT1iq6wEyUQh54Yw8SYH2q5S5orsvu7UtMCqPJbGY6sqEpV9JvLSgCkRNpVsB" },
        { "protocol": "ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK",
          "chain_id": "NetXSzLHKwSumh7",
          "hash": "onuPoduGPsNpD4P2ByvWF4uobk5357izfZrLaerHAAmHi3Q1MeF",
          "branch": "BLab2wMjtmdUfdPMrj6ymAVGGC7F1WKDSYwHeNw74zg1q13QyjX",
          "contents":
            [ { "kind": "endorsement", "level": 90547,
                "metadata":
                  { "balance_updates":
                      [ { "kind": "contract",
                          "contract": "tz1UKmZhi8dhUX5a5QTfCrsH9pK4dt1dVfJo",
                          "change": "-256000000" },
                        { "kind": "freezer", "category": "deposits",
                          "delegate": "tz1UKmZhi8dhUX5a5QTfCrsH9pK4dt1dVfJo",
                          "level": 707, "change": "256000000" },
                        { "kind": "freezer", "category": "rewards",
                          "delegate": "tz1UKmZhi8dhUX5a5QTfCrsH9pK4dt1dVfJo",
                          "level": 707, "change": "8000000" } ],
                    "delegate": "tz1UKmZhi8dhUX5a5QTfCrsH9pK4dt1dVfJo",
                    "slots": [ 31, 24, 18, 12 ] } } ],
          "signature":
            "sigWq5KjaBtSYbaNTgcAgpuiWrvY41Xf7JsRNQZyMDSrTvf2Mr4sj4ybvorv2jSsKMhYzWy9yH3UpaZDzeNVtEQyRJ4S1btA" } ],
      [], [], [] ] }
|
2018-12-16 23:20:04,760 - main - DEBUG - consumer0 - head: branch BLjJ47LiBBqZShBWAAFuXoPQQwTz55gvKuFHE6CdXE331CeGL6d counter 86609 protocol ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK
2018-12-16 23:20:04,761 - main - INFO - consumer0 - Payment content: {"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya","fee":"1274","counter":"86610","gas_limit": "10100", "storage_limit": "0","amount":"11528726"}
2018-12-16 23:20:04,761 - main - INFO - consumer0 - Payment content: {"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc","fee":"1274","counter":"86611","gas_limit": "10100", "storage_limit": "0","amount":"7684726"}
2018-12-16 23:20:04,761 - main - INFO - consumer0 - Payment content: {"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1","fee":"1274","counter":"86612","gas_limit": "10100", "storage_limit": "0","amount":"7684726"}
2018-12-16 23:20:04,761 - main - INFO - consumer0 - Payment content: {"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT","fee":"1274","counter":"86613","gas_limit": "10100", "storage_limit": "0","amount":"23826726"}
2018-12-16 23:20:04,761 - main - INFO - consumer0 - Payment content: {"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6","fee":"1274","counter":"86614","gas_limit": "10100", "storage_limit": "0","amount":"1268725"}
2018-12-16 23:20:04,761 - main - DEBUG - consumer0 - Running 5 operations
2018-12-16 23:20:04,761 - main - DEBUG - consumer0 - runops_command_str is |/opt/tezos-zeronet/bin/tezos-client rpc post http://127.0.0.1:8742/chains/main/blocks/head/helpers/scripts/run_operation with '{"branch": "BLjJ47LiBBqZShBWAAFuXoPQQwTz55gvKuFHE6CdXE331CeGL6d","contents":[{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya","fee":"1274","counter":"86610","gas_limit": "10100", "storage_limit": "0","amount":"11528726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc","fee":"1274","counter":"86611","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1","fee":"1274","counter":"86612","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT","fee":"1274","counter":"86613","gas_limit": "10100", "storage_limit": "0","amount":"23826726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6","fee":"1274","counter":"86614","gas_limit": "10100", "storage_limit": "0","amount":"1268725"}], "signature":"edsigtXomBKi5CTRf5cjATJWSyaRvhfYNHqSUGrn4SdbYRcGwQrUGjzEfQDTuqHhuA8b2d8NarZjz8TRf65WkpQmo423BtomS8Q"}'|
Command is |/opt/tezos-zeronet/bin/tezos-client rpc post http://127.0.0.1:8742/chains/main/blocks/head/helpers/scripts/run_operation with '{"branch": "BLjJ47LiBBqZShBWAAFuXoPQQwTz55gvKuFHE6CdXE331CeGL6d","contents":[{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya","fee":"1274","counter":"86610","gas_limit": "10100", "storage_limit": "0","amount":"11528726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc","fee":"1274","counter":"86611","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1","fee":"1274","counter":"86612","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT","fee":"1274","counter":"86613","gas_limit": "10100", "storage_limit": "0","amount":"23826726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6","fee":"1274","counter":"86614","gas_limit": "10100", "storage_limit": "0","amount":"1268725"}], "signature":"edsigtXomBKi5CTRf5cjATJWSyaRvhfYNHqSUGrn4SdbYRcGwQrUGjzEfQDTuqHhuA8b2d8NarZjz8TRf65WkpQmo423BtomS8Q"}'|
Answer is |{ "contents":
    [ { "kind": "transaction",
        "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
        "counter": "86610", "gas_limit": "10100", "storage_limit": "0",
        "amount": "11528726",
        "destination": "KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya",
        "metadata":
          { "balance_updates":
              [ { "kind": "contract",
                  "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                  "change": "-1274" },
                { "kind": "freezer", "category": "fees",
                  "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                  "level": 707, "change": "1274" } ],
            "operation_result":
              { "status": "applied",
                "balance_updates":
                  [ { "kind": "contract",
                      "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                      "change": "-11528726" },
                    { "kind": "contract",
                      "contract": "KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya",
                      "change": "11528726" } ], "consumed_gas": "10100" } } },
      { "kind": "transaction",
        "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
        "counter": "86611", "gas_limit": "10100", "storage_limit": "0",
        "amount": "7684726",
        "destination": "KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc",
        "metadata":
          { "balance_updates":
              [ { "kind": "contract",
                  "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                  "change": "-1274" },
                { "kind": "freezer", "category": "fees",
                  "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                  "level": 707, "change": "1274" } ],
            "operation_result":
              { "status": "applied",
                "balance_updates":
                  [ { "kind": "contract",
                      "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                      "change": "-7684726" },
                    { "kind": "contract",
                      "contract": "KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc",
                      "change": "7684726" } ], "consumed_gas": "10100" } } },
      { "kind": "transaction",
        "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
        "counter": "86612", "gas_limit": "10100", "storage_limit": "0",
        "amount": "7684726",
        "destination": "KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1",
        "metadata":
          { "balance_updates":
              [ { "kind": "contract",
                  "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                  "change": "-1274" },
                { "kind": "freezer", "category": "fees",
                  "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                  "level": 707, "change": "1274" } ],
            "operation_result":
              { "status": "applied",
                "balance_updates":
                  [ { "kind": "contract",
                      "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                      "change": "-7684726" },
                    { "kind": "contract",
                      "contract": "KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1",
                      "change": "7684726" } ], "consumed_gas": "10100" } } },
      { "kind": "transaction",
        "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
        "counter": "86613", "gas_limit": "10100", "storage_limit": "0",
        "amount": "23826726",
        "destination": "KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT",
        "metadata":
          { "balance_updates":
              [ { "kind": "contract",
                  "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                  "change": "-1274" },
                { "kind": "freezer", "category": "fees",
                  "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                  "level": 707, "change": "1274" } ],
            "operation_result":
              { "status": "applied",
                "balance_updates":
                  [ { "kind": "contract",
                      "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                      "change": "-23826726" },
                    { "kind": "contract",
                      "contract": "KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT",
                      "change": "23826726" } ], "consumed_gas": "10100" } } },
      { "kind": "transaction",
        "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
        "counter": "86614", "gas_limit": "10100", "storage_limit": "0",
        "amount": "1268725",
        "destination": "tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6",
        "metadata":
          { "balance_updates":
              [ { "kind": "contract",
                  "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                  "change": "-1274" },
                { "kind": "freezer", "category": "fees",
                  "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                  "level": 707, "change": "1274" } ],
            "operation_result":
              { "status": "applied",
                "balance_updates":
                  [ { "kind": "contract",
                      "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                      "change": "-1268725" },
                    { "kind": "contract",
                      "contract": "tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6",
                      "change": "1268725" } ], "consumed_gas": "10100" } } } ] }
|
2018-12-16 23:20:04,970 - main - DEBUG - consumer0 - Forging 5 operations
2018-12-16 23:20:04,970 - main - DEBUG - consumer0 - forge_command_str is |/opt/tezos-zeronet/bin/tezos-client rpc post http://127.0.0.1:8742/chains/main/blocks/head/helpers/forge/operations with '{"branch": "BLjJ47LiBBqZShBWAAFuXoPQQwTz55gvKuFHE6CdXE331CeGL6d","contents":[{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya","fee":"1274","counter":"86610","gas_limit": "10100", "storage_limit": "0","amount":"11528726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc","fee":"1274","counter":"86611","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1","fee":"1274","counter":"86612","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT","fee":"1274","counter":"86613","gas_limit": "10100", "storage_limit": "0","amount":"23826726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6","fee":"1274","counter":"86614","gas_limit": "10100", "storage_limit": "0","amount":"1268725"}]}'|
Command is |/opt/tezos-zeronet/bin/tezos-client rpc post http://127.0.0.1:8742/chains/main/blocks/head/helpers/forge/operations with '{"branch": "BLjJ47LiBBqZShBWAAFuXoPQQwTz55gvKuFHE6CdXE331CeGL6d","contents":[{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya","fee":"1274","counter":"86610","gas_limit": "10100", "storage_limit": "0","amount":"11528726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc","fee":"1274","counter":"86611","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1","fee":"1274","counter":"86612","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT","fee":"1274","counter":"86613","gas_limit": "10100", "storage_limit": "0","amount":"23826726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6","fee":"1274","counter":"86614","gas_limit": "10100", "storage_limit": "0","amount":"1268725"}]}'|
Answer is |"85feaf09f9d8d90b5d3e661e6e4654d350de264ba66888b069d6f30bc69e1e170800002122d44d997e158c36c60649d198c4175dad425efa09d2a405f44e0096d4bf0501420eaa410ac21addf427211cddd6115cba385a9400000800002122d44d997e158c36c60649d198c4175dad425efa09d3a405f44e00f684d503015b1fe1533ead0cfb467bbcc8cebb7cba3d7b51c300000800002122d44d997e158c36c60649d198c4175dad425efa09d4a405f44e00f684d503015652828cdc899119e9d64038e58c998c7ddd359d00000800002122d44d997e158c36c60649d198c4175dad425efa09d5a405f44e00a6a2ae0b011e17684cbe6ce6cdfac331d30c17ed8a514941ed00000800002122d44d997e158c36c60649d198c4175dad425efa09d6a405f44e00f5b74d0000e7b70b8ce7e3a89648cef109f828e67dc1371ebb00"
|
2018-12-16 23:20:05,844 - main - DEBUG - consumer0 - Preapplying the operations
2018-12-16 23:20:05,844 - main - DEBUG - consumer0 - preapply_command_str is |/opt/tezos-zeronet/bin/tezos-client rpc post http://127.0.0.1:8742/chains/main/blocks/head/helpers/preapply/operations with '[{"protocol":"ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK","branch":"BLjJ47LiBBqZShBWAAFuXoPQQwTz55gvKuFHE6CdXE331CeGL6d","contents":[{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya","fee":"1274","counter":"86610","gas_limit": "10100", "storage_limit": "0","amount":"11528726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc","fee":"1274","counter":"86611","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1","fee":"1274","counter":"86612","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT","fee":"1274","counter":"86613","gas_limit": "10100", "storage_limit": "0","amount":"23826726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6","fee":"1274","counter":"86614","gas_limit": "10100", "storage_limit": "0","amount":"1268725"}],"signature":"sigbUAEgqj5neuP7vEcUNV6NQi7ckoH3LzCmrbJmwZeWemiyRYE5y7gZwfKQWLdZ9FX13eW2CikcqCG5HwTZLSYahRZxyALk"}]'|
Command is |/opt/tezos-zeronet/bin/tezos-client rpc post http://127.0.0.1:8742/chains/main/blocks/head/helpers/preapply/operations with '[{"protocol":"ProtoALphaALphaALphaALphaALphaALphaALphaALphaDdp3zK","branch":"BLjJ47LiBBqZShBWAAFuXoPQQwTz55gvKuFHE6CdXE331CeGL6d","contents":[{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya","fee":"1274","counter":"86610","gas_limit": "10100", "storage_limit": "0","amount":"11528726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc","fee":"1274","counter":"86611","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1","fee":"1274","counter":"86612","gas_limit": "10100", "storage_limit": "0","amount":"7684726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT","fee":"1274","counter":"86613","gas_limit": "10100", "storage_limit": "0","amount":"23826726"},{"kind":"transaction","source":"tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc","destination":"tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6","fee":"1274","counter":"86614","gas_limit": "10100", "storage_limit": "0","amount":"1268725"}],"signature":"sigbUAEgqj5neuP7vEcUNV6NQi7ckoH3LzCmrbJmwZeWemiyRYE5y7gZwfKQWLdZ9FX13eW2CikcqCG5HwTZLSYahRZxyALk"}]'|
Answer is |[ { "contents":
      [ { "kind": "transaction",
          "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
          "counter": "86610", "gas_limit": "10100", "storage_limit": "0",
          "amount": "11528726",
          "destination": "KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya",
          "metadata":
            { "balance_updates":
                [ { "kind": "contract",
                    "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                    "change": "-1274" },
                  { "kind": "freezer", "category": "fees",
                    "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                    "level": 707, "change": "1274" } ],
              "operation_result":
                { "status": "applied",
                  "balance_updates":
                    [ { "kind": "contract",
                        "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                        "change": "-11528726" },
                      { "kind": "contract",
                        "contract": "KT1Ec3jNXyxyA54nezwcjGDRoutECJCQjpya",
                        "change": "11528726" } ], "consumed_gas": "10100" } } },
        { "kind": "transaction",
          "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
          "counter": "86611", "gas_limit": "10100", "storage_limit": "0",
          "amount": "7684726",
          "destination": "KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc",
          "metadata":
            { "balance_updates":
                [ { "kind": "contract",
                    "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                    "change": "-1274" },
                  { "kind": "freezer", "category": "fees",
                    "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                    "level": 707, "change": "1274" } ],
              "operation_result":
                { "status": "applied",
                  "balance_updates":
                    [ { "kind": "contract",
                        "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                        "change": "-7684726" },
                      { "kind": "contract",
                        "contract": "KT1GtbFJ6CvpWmHuG2DMyMMwmp3ZQ9PBAuCc",
                        "change": "7684726" } ], "consumed_gas": "10100" } } },
        { "kind": "transaction",
          "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
          "counter": "86612", "gas_limit": "10100", "storage_limit": "0",
          "amount": "7684726",
          "destination": "KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1",
          "metadata":
            { "balance_updates":
                [ { "kind": "contract",
                    "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                    "change": "-1274" },
                  { "kind": "freezer", "category": "fees",
                    "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                    "level": 707, "change": "1274" } ],
              "operation_result":
                { "status": "applied",
                  "balance_updates":
                    [ { "kind": "contract",
                        "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                        "change": "-7684726" },
                      { "kind": "contract",
                        "contract": "KT1GTCX9yH9MoxYf8VWa9goS3y4wVWV2ofV1",
                        "change": "7684726" } ], "consumed_gas": "10100" } } },
        { "kind": "transaction",
          "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
          "counter": "86613", "gas_limit": "10100", "storage_limit": "0",
          "amount": "23826726",
          "destination": "KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT",
          "metadata":
            { "balance_updates":
                [ { "kind": "contract",
                    "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                    "change": "-1274" },
                  { "kind": "freezer", "category": "fees",
                    "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                    "level": 707, "change": "1274" } ],
              "operation_result":
                { "status": "applied",
                  "balance_updates":
                    [ { "kind": "contract",
                        "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                        "change": "-23826726" },
                      { "kind": "contract",
                        "contract": "KT1BKsstwtSKtyhVBc23mqRKWw1vhkDQooMT",
                        "change": "23826726" } ], "consumed_gas": "10100" } } },
        { "kind": "transaction",
          "source": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc", "fee": "1274",
          "counter": "86614", "gas_limit": "10100", "storage_limit": "0",
          "amount": "1268725",
          "destination": "tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6",
          "metadata":
            { "balance_updates":
                [ { "kind": "contract",
                    "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                    "change": "-1274" },
                  { "kind": "freezer", "category": "fees",
                    "delegate": "tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU",
                    "level": 707, "change": "1274" } ],
              "operation_result":
                { "status": "applied",
                  "balance_updates":
                    [ { "kind": "contract",
                        "contract": "tz1NfEiS2uJsX43vowNjau5pdqg3Nvy8whvc",
                        "change": "-1268725" },
                      { "kind": "contract",
                        "contract": "tz1gmE4dV2rL2y9PRjN86q9HJZiFgdX4Wqw6",
                        "change": "1268725" } ], "consumed_gas": "10100" } } } ],
    "signature":
      "sigbUAEgqj5neuP7vEcUNV6NQi7ckoH3LzCmrbJmwZeWemiyRYE5y7gZwfKQWLdZ9FX13eW2CikcqCG5HwTZLSYahRZxyALk" } ]
|
2018-12-16 23:20:06,045 - main - DEBUG - consumer0 - Injecting 5 operations
2018-12-16 23:20:06,045 - main - DEBUG - consumer0 - inject_command_str is |/opt/tezos-zeronet/bin/tezos-client -l rpc post http://127.0.0.1:8742/injection/operation with '"85feaf09f9d8d90b5d3e661e6e4654d350de264ba66888b069d6f30bc69e1e170800002122d44d997e158c36c60649d198c4175dad425efa09d2a405f44e0096d4bf0501420eaa410ac21addf427211cddd6115cba385a9400000800002122d44d997e158c36c60649d198c4175dad425efa09d3a405f44e00f684d503015b1fe1533ead0cfb467bbcc8cebb7cba3d7b51c300000800002122d44d997e158c36c60649d198c4175dad425efa09d4a405f44e00f684d503015652828cdc899119e9d64038e58c998c7ddd359d00000800002122d44d997e158c36c60649d198c4175dad425efa09d5a405f44e00a6a2ae0b011e17684cbe6ce6cdfac331d30c17ed8a514941ed00000800002122d44d997e158c36c60649d198c4175dad425efa09d6a405f44e00f5b74d0000e7b70b8ce7e3a89648cef109f828e67dc1371ebb00fb685d25ba1c2cdff621cb2eab62a9b0a01bede5764c987e3d4fdc9c1e916829fb6522b51c90d1daf11b8efd62681eb88c0ff6dc1b0ce33c564cce59ab08"'|
Command is |/opt/tezos-zeronet/bin/tezos-client -l rpc post http://127.0.0.1:8742/injection/operation with '"85feaf09f9d8d90b5d3e661e6e4654d350de264ba66888b069d6f30bc69e1e170800002122d44d997e158c36c60649d198c4175dad425efa09d2a405f44e0096d4bf0501420eaa410ac21addf427211cddd6115cba385a9400000800002122d44d997e158c36c60649d198c4175dad425efa09d3a405f44e00f684d503015b1fe1533ead0cfb467bbcc8cebb7cba3d7b51c300000800002122d44d997e158c36c60649d198c4175dad425efa09d4a405f44e00f684d503015652828cdc899119e9d64038e58c998c7ddd359d00000800002122d44d997e158c36c60649d198c4175dad425efa09d5a405f44e00a6a2ae0b011e17684cbe6ce6cdfac331d30c17ed8a514941ed00000800002122d44d997e158c36c60649d198c4175dad425efa09d6a405f44e00f5b74d0000e7b70b8ce7e3a89648cef109f828e67dc1371ebb00fb685d25ba1c2cdff621cb2eab62a9b0a01bede5764c987e3d4fdc9c1e916829fb6522b51c90d1daf11b8efd62681eb88c0ff6dc1b0ce33c564cce59ab08"'|
Answer is |Unexpected server answer

|
2018-12-16 23:20:06,243 - main - ERROR - consumer0 - Error in inject response 'Unexpected server answer

'
2018-12-16 23:20:06,243 - main - DEBUG - consumer0 - Batch payment attempt 0 failed
2018-12-16 23:20:06,243 - main - DEBUG - consumer0 - Wait for 46 seconds before trying again
2018-12-16 23:20:09,643 - main - INFO - MainThread - Interrupted.
2018-12-16 23:20:09,644 - main - INFO - MainThread - --------------------------------------------------------
2018-12-16 23:20:09,644 - main - INFO - MainThread - Sensitive operations are in progress!
2018-12-16 23:20:09,645 - main - INFO - MainThread - Please wait while the application is being shut down!
2018-12-16 23:20:09,645 - main - INFO - MainThread - --------------------------------------------------------
2018-12-16 23:20:09,645 - main - INFO - MainThread - Lock file removed!

Where I made a mistake?

error in dry mode

Describe the bug
A clear and concise description of what the bug is.

when I run the last cycle (64) in the dry mode, it gives an error.

  • address balance is positive.
  • I am on the latest update.
2019-02-03 21:39:05,809 - main - ERROR - consumer0 - Error at reward payment
Traceback (most recent call last):

  File "/home/t32/tezos-reward-distributor/src/pay/payment_consumer.py", line 70, in run
    payment_logs = batch_payer.pay(payment_items, self.verbose, dry_run=self.dry_run)
  File "/home/t32/tezos-reward-distributor/src/pay/batch_payer.py", line 79, in pay
    payments_log = self.pay_single_batch_wrap(payment_items_chunk, verbose=verbose, dry_run=dry_run)
  File "/home/t32/tezos-reward-distributor/src/pay/batch_payer.py", line 94, in pay_single_batch_wrap
    return_code, operation_hash = self.pay_single_batch(payment_items, verbose, dry_run=dry_run)
  File "/home/t32/tezos-reward-distributor/src/pay/batch_payer.py", line 155, in pay_single_batch
    error_desc = parse_json_response(runops_command_response)
  File "/home/t32/tezos-reward-distributor/src/util/rpc_utils.py", line 16, in parse_json_response
    raise Exception("Unknown client response format")
Exception: Unknown client response format```


**Expected behavior**
Reward Payment

**Environment**
 - Source Code Build
 - Chain mainnet
 - python3 src/main.py  -C 64  -M 3 -D  pay1

V3 Migration

When importing v3, 2 folders are created in the home directory.

  1. pymnt - cnfg - tz1.... .yaml
  2. tezos-reward-distributor-v3 - there is also tz1boot1 ..... 889 .yaml file

I edited the file imported from version 2.1 which is in the folder: pymnt - cnfg - tz1..yaml
but failed to start the dry mode.
where is the mistake? It seems to me in the configuration of the .yaml file.
What should I indicate in my billing address, alias or address?

the same file tz1boot1.....889.yaml is found as an example, as I understand it?

Error running the actual payout

I am running python3 src/main.py KTxx but the script gives me errors (see screenshot)
the KT1 address is pass encrypted during the run i never got question about the fill in my pass is that maybe the reason why this fails?

Expected behavior
Do the actual payment

Screenshots
image

Environment

  • Source Code Build
  • Chain mainnet
  • actual command used python3 src/main.py KTxx

Better failed payment flow

Is your feature request related to a problem? Please describe.
Currently, failed payments are re-tried after doing all pending payments. It may be too late. A better approach is needed.

Describe the solution you'd like
Create another thread to maintain failed payments. It will regularly check for failed payments and feed them to payment queue for a retry.

Transfer fee is taken from delegators

Describe the bug
Delegator is awarded Y XTZ. When the transfer operation is created, the fee is deducted from Y. Delegator receives (Y - txnFee).

Expected
It is expected that delegators receive Y as their calculated reward.

Implementation
Give bakers the option to pay the transfer fee if they wish.

Error sending dry-run payment

Describe the bug
A clear and concise description of what the bug is.

Recieving an Unexpected server answer when running:
~/tezos-reward-distributor$ python3 src/main.py -C 58 -M 3 -D -V
Running version 3

To Reproduce
Steps to reproduce the behavior:

  1. ran this command:
    ~/tezos-reward-distributor$ python3 src/main.py -C 58 -M 3 -D -V

  2. My config file looks like this:

version : 1.0
baking_address : tzxxxxBAKERADDRESSxxxxxx
payment_address : tzxxxPAYMENTADDRESSxxxx
service_fee : 8.0
founders_map : {}
owners_map : {}
prcnt_scale : None
pymnt_scale : None
specials_map : {}
supporters_set : {}
min_delegation_amt : 0
excluded_delegators_set : {}
delegator_pays_xfer_fee : True

  1. See error

Answer is |Unexpected server answer
|
2019-02-26 15:12:26,857 - main - ERROR - consumer0 - Error at reward payment
Traceback (most recent call last):
File "/home/b/tezos-reward-distributor/src/pay/payment_consumer.py", line 72, in run
payment_logs = batch_payer.pay(payment_items, self.verbose, dry_run=self.dry_run)
File "/home/b/tezos-reward-distributor/src/pay/batch_payer.py", line 96, in pay
payments_log = self.pay_single_batch_wrap(payment_items_chunk, verbose=verbose, dry_run=dry_run)
File "/home/b/tezos-reward-distributor/src/pay/batch_payer.py", line 111, in pay_single_batch_wrap
return_code, operation_hash = self.pay_single_batch(payment_items, verbose, dry_run=dry_run)
File "/home/b/tezos-reward-distributor/src/pay/batch_payer.py", line 172, in pay_single_batch
error_desc = parse_json_response(runops_command_response)
File "/home/b/tezos-reward-distributor/src/util/rpc_utils.py", line 16, in parse_json_response
raise Exception("Unknown client response format")
Exception: Unknown client response format
2019-02-26 15:12:26,858 - main - DEBUG - consumer0 - Exit signal received. Killing the thread...
2019-02-26 15:12:26,858 - main - INFO - consumer0 - Consumer returning ...
2019-02-26 15:12:30,132 - main - INFO - MainThread - Interrupted.
2019-02-26 15:12:30,133 - main - INFO - MainThread - --------------------------------------------------------
2019-02-26 15:12:30,133 - main - INFO - MainThread - Sensitive operations are in progress!
2019-02-26 15:12:30,134 - main - INFO - MainThread - Please wait while the application is being shut down!
2019-02-26 15:12:30,134 - main - INFO - MainThread - --------------------------------------------------------

Payment History Front End

Is your feature request related to a problem? Please describe.
Bakers need to show their payment history to their delegators. Payment application produces csv files which can be used to feed the front end application.

Describe the solution you'd like
A front-end application which will display payments by cycle. It should allow search with delegator address. It should be fed easily. It should be simple. It should be easy to maintain and manage.

Describe alternatives you've considered
One huge json file approach is1 simple but not sustainable in long-term due to the increasing size of json files. Json file with limited history can be considered instead.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.