-
Notifications
You must be signed in to change notification settings - Fork 37
Expand file tree
/
Copy pathcli_faucet.py
More file actions
93 lines (63 loc) · 3.13 KB
/
cli_faucet.py
File metadata and controls
93 lines (63 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import logging
import webbrowser
from enum import Enum
from typing import Any
from multiversx_sdk import Message, NativeAuthClient, NativeAuthClientConfig
from multiversx_sdk_cli import cli_shared
from multiversx_sdk_cli.errors import ArgumentsNotProvidedError, BadUserInput
logger = logging.getLogger("cli.faucet")
class WebWalletUrls(Enum):
DEVNET = "https://devnet-wallet.multiversx.com"
TESTNET = "https://testnet-wallet.multiversx.com"
class ApiUrls(Enum):
DEVNET = "https://devnet-api.multiversx.com"
TESTNET = "https://testnet-api.multiversx.com"
def setup_parser(args: list[str], subparsers: Any) -> Any:
parser = cli_shared.add_group_subparser(subparsers, "faucet", "Get xEGLD on Devnet or Testnet")
subparsers = parser.add_subparsers()
sub = cli_shared.add_command_subparser(subparsers, "faucet", "request", "Request xEGLD.")
cli_shared.add_wallet_args(args, sub)
sub.add_argument("--chain", choices=["D", "T"], help="the chain identifier")
sub.add_argument("--api", type=str, help="custom api url for the native auth client")
sub.add_argument(
"--api-headers",
nargs="+",
metavar="KEY=VALUE",
help="extra HTTP headers for API requests, e.g. 'Api-Key=mytoken'"
)
sub.add_argument("--wallet-url", type=str, help="custom wallet url to call the faucet from")
sub.set_defaults(func=faucet)
parser.epilog = cli_shared.build_group_epilog(subparsers)
return subparsers
def faucet(args: Any):
account = cli_shared.prepare_account(args)
wallet, api = get_wallet_and_api_urls(args)
extra_headers = cli_shared.parse_proxy_headers(getattr(args, "api_headers", None))
config = NativeAuthClientConfig(origin=wallet, api_url=api, extra_request_headers=extra_headers or None)
client = NativeAuthClient(config)
init_token = client.initialize()
token_for_siginig = f"{account.address.to_bech32()}{init_token}"
signature = account.sign_message(Message(token_for_siginig.encode()))
access_token = client.get_token(address=account.address, token=init_token, signature=signature.hex())
logger.info(f"Requesting funds for address: {account.address.to_bech32()}")
call_web_wallet_faucet(wallet_url=wallet, access_token=access_token)
def call_web_wallet_faucet(wallet_url: str, access_token: str):
faucet_url = f"{wallet_url}/faucet?accessToken={access_token}"
webbrowser.open_new_tab(faucet_url)
def get_wallet_and_api_urls(args: Any) -> tuple[str, str]:
chain: str = args.chain
if not chain:
return get_custom_wallet_and_api_urls(args)
if chain.upper() == "D":
return WebWalletUrls.DEVNET.value, ApiUrls.DEVNET.value
if chain.upper() == "T":
return WebWalletUrls.TESTNET.value, ApiUrls.TESTNET.value
raise BadUserInput("Invalid chain id. Choose between 'D' for devnet and 'T' for testnet.")
def get_custom_wallet_and_api_urls(args: Any) -> tuple[str, str]:
wallet = args.wallet_url
api = args.api
if not wallet:
raise ArgumentsNotProvidedError("--wallet-url not provided")
if not api:
raise ArgumentsNotProvidedError("--api not provided")
return wallet, api