Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
silkaj
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
clients
python
silkaj
Commits
7f3812b6
Commit
7f3812b6
authored
4 years ago
by
Moul
Browse files
Options
Downloads
Patches
Plain Diff
[feat]
#175
: balance: migrate to GVA
One request Generate one table
parent
9ec6f3fd
No related branches found
No related tags found
No related merge requests found
Pipeline
#12732
passed
3 years ago
Stage: checks
Stage: tests
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
silkaj/money.py
+69
-61
69 additions, 61 deletions
silkaj/money.py
tests/test_end_to_end.py
+2
-2
2 additions, 2 deletions
tests/test_end_to_end.py
with
71 additions
and
63 deletions
silkaj/money.py
+
69
−
61
View file @
7f3812b6
...
...
@@ -13,12 +13,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with Silkaj. If not, see <https://www.gnu.org/licenses/>.
import
sys
from
click
import
argument
,
command
,
echo
,
pass_context
from
duniterpy.api.bma
import
blockchain
,
tx
from
duniterpy.documents.transaction
import
InputSource
from
tabulate
import
tabulate
from
silkaj
import
wot_tools
as
wt
from
silkaj
import
constants
from
silkaj.auth
import
auth_method
,
has_auth_method
from
silkaj.blockchain_tools
import
HeadBlock
from
silkaj.crypto_tools
import
(
...
...
@@ -26,8 +28,8 @@ from silkaj.crypto_tools import (
is_pubkey_and_check
,
validate_checksum
,
)
from
silkaj.network_tools
import
ClientInstance
from
silkaj.tools
import
CurrencySymbol
,
coroutine
,
message_exit
from
silkaj.network_tools
import
ClientInstance
,
gva_query
from
silkaj.tools
import
coroutine
,
message_exit
from
silkaj.tui
import
display_amount
,
display_pubkey_and_checksum
...
...
@@ -36,9 +38,19 @@ from silkaj.tui import display_amount, display_pubkey_and_checksum
@pass_context
@coroutine
async
def
cmd_amount
(
ctx
,
pubkeys
):
client
=
ClientInstance
().
client
if
not
has_auth_method
():
def
gen_query
(
pubkeys_list
):
pubkeys_str
=
"
"
.
join
(
f
'"
{
pubkey
}
"'
for
pubkey
in
pubkeys_list
)
return
f
'
query {{
\
balances(scripts: [
{
pubkeys_str
}
]){{amount}}
\
currentBlock{{monetaryMass membersCount}}
\
currentUd{{amount}}
\
idty(pubkey:
"
{
pubkeys_list
[
0
]
}
"
){{username}}
\
node {{peer {{currency}} }}
\
}}
'
if
has_auth_method
():
pubkeys_list
=
auth_method
().
pubkey
else
:
# check input pubkeys
if
not
pubkeys
:
message_exit
(
"
You should specify one or many pubkeys
"
)
...
...
@@ -57,69 +69,65 @@ async def cmd_amount(ctx, pubkeys):
if
wrong_pubkeys
:
message_exit
(
"
Please check the pubkeys format.
"
)
total
=
[
0
,
0
]
for
pubkey
in
pubkeys_list
:
inputs_balance
=
await
get_amount_from_pubkey
(
pubkey
)
await
show_amount_from_pubkey
(
pubkey
,
inputs_balance
)
total
[
0
]
+=
inputs_balance
[
0
]
total
[
1
]
+=
inputs_balance
[
1
]
if
len
(
pubkeys_list
)
>
1
:
await
show_amount_from_pubkey
(
"
Total
"
,
total
)
else
:
key
=
auth_method
()
pubkey
=
key
.
pubkey
await
show_amount_from_pubkey
(
pubkey
,
await
get_amount_from_pubkey
(
pubkey
))
await
client
.
close
()
async
def
show_amount_from_pubkey
(
label
,
inputs_balance
):
response
=
await
gva_query
(
gen_query
(
pubkeys_list
))
if
not
response
:
pubkey_checksum
=
display_pubkey_and_checksum
(
pubkeys_list
)
sys
.
exit
(
f
"
{
pubkey_checksum
}
public key without money activity.
"
)
currency
=
response
[
"
node
"
][
"
peer
"
][
"
currency
"
]
if
currency
==
"
g1
"
:
currency_symbol
=
constants
.
G1_SYMBOL
elif
currency
==
"
g1-test
"
:
currency_symbol
=
constants
.
GTEST_SYMBOL
current_block
=
response
[
"
currentBlock
"
]
average
=
current_block
[
"
monetaryMass
"
]
/
current_block
[
"
membersCount
"
]
current_ud
=
response
[
"
currentUd
"
][
"
amount
"
]
uid
=
response
[
"
idty
"
][
"
username
"
]
if
response
[
"
idty
"
]
else
None
table
=
[]
balances_sum
=
{
"
amount
"
:
0
}
for
pubkey
,
balance
in
zip
(
pubkeys_list
,
response
[
"
balances
"
]):
gen_table
(
table
,
pubkey
,
balance
,
current_ud
,
average
,
currency_symbol
,
uid
)
if
balance
:
balances_sum
[
"
amount
"
]
+=
balance
[
"
amount
"
]
if
len
(
pubkeys_list
)
>
1
:
gen_table
(
table
,
"
Total
"
,
balances_sum
,
current_ud
,
average
,
currency_symbol
)
echo
(
tabulate
(
table
,
tablefmt
=
"
fancy_grid
"
))
def
gen_table
(
table
,
label
,
balance
,
current_ud
,
average
,
currency_symbol
,
uid
=
None
):
"""
Shows the balance of a pubkey.
`label` can be either a pubkey or
"
Total
"
.
if `pubkey` is a pubkey, get pubkey:checksum
"""
totalAmountInput
=
inputs_balance
[
0
]
balance
=
inputs_balance
[
1
]
currency_symbol
=
await
CurrencySymbol
().
symbol
ud_value
=
await
UDValue
().
ud_value
average
,
monetary_mass
=
await
get_average
()
member
=
False
# if `pubkey` is a pubkey, get pubkey:checksum and uid
if
label
!=
"
Total
"
:
member
=
await
wt
.
is_member
(
label
)
label
=
display_pubkey_and_checksum
(
label
)
# display balance table
display
=
list
()
display
.
append
([
"
Balance of pubkey
"
,
label
])
if
member
:
display
.
append
([
"
User identifier
"
,
member
[
"
uid
"
]])
if
totalAmountInput
-
balance
!=
0
:
display_amount
(
display
,
"
Blockchain
"
,
balance
,
ud_value
,
currency_symbol
)
table
.
append
([
"
Balance of pubkey
"
,
label
])
if
uid
:
table
.
append
([
"
User identifier
"
,
uid
])
if
balance
:
"""
TODO: handle pendings?
if totalAmountInput - balance != 0:
display_amount(table,
"
Blockchain balance
"
, balance, current_ud, currency_symbol)
display_amount(
table,
"
Pendings balance
"
,
totalAmountInput - balance,
current_ud,
currency_symbol,
)
"""
display_amount
(
display
,
"
Pending transaction
"
,
(
totalAmountInput
-
balance
),
ud_value
,
currency_symbol
,
table
,
"
Total balance
"
,
balance
[
"
amount
"
],
current_ud
,
currency_symbol
)
display_amount
(
display
,
"
Total amount
"
,
totalAmountInput
,
ud_value
,
currency_symbol
)
display
.
append
(
[
"
Total relative to M/N
"
,
"
{0} x M/N
"
.
format
(
round
(
totalAmountInput
/
average
,
2
)),
]
)
echo
(
tabulate
(
display
,
tablefmt
=
"
fancy_grid
"
))
async
def
get_average
():
head
=
await
HeadBlock
().
head_block
monetary_mass
=
head
[
"
monetaryMass
"
]
members_count
=
head
[
"
membersCount
"
]
average
=
monetary_mass
/
members_count
return
average
,
monetary_mass
relative
=
round
(
balance
[
"
amount
"
]
/
average
,
2
)
line
=
[
"
Total relative to M/N
"
,
f
"
{
relative
}
× M/N
"
]
table
.
append
(
line
)
else
:
table
.
append
([
"
Public key
"
,
"
Without money activity
"
])
async
def
get_amount_from_pubkey
(
pubkey
):
...
...
This diff is collapsed.
Click to expand it.
tests/test_end_to_end.py
+
2
−
2
View file @
7f3812b6
...
...
@@ -50,9 +50,9 @@ def test_balance():
silkaj
+
[
"
--gtest
"
,
"
balance
"
,
"
3dnbnYY9i2bHMQUGyFp5GVvJ2wBkVpus31cDJA5cfRpj
"
]
).
decode
()
assert
(
"
│ Balance of pubkey │ 3dnbnYY9i2bHMQUGyFp5GVvJ2wBkVpus31cDJA5cfRpj:EyF │
"
"
│ Balance of pubkey
│ 3dnbnYY9i2bHMQUGyFp5GVvJ2wBkVpus31cDJA5cfRpj:EyF │
"
in
output
)
assert
"
│ Total
amount
(unit|relative) │
"
in
output
assert
"
│ Total
balance
(unit|relative) │
"
in
output
assert
"
UD ĞTest
"
in
output
assert
"
Total relative to M/N
"
in
output
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment