thunderhub/schema.gql
Bufo d940f37dc9
refactor: extract magma trading into separate module
Move all Magma/trading code out of the tapd module into a dedicated
`src/server/modules/api/magma/` module. The tapd module now only handles
local tapd node operations (assets, balances, minting, channels, universe).
2026-04-08 09:47:08 +02:00

1107 lines
No EOL
22 KiB
GraphQL

# ------------------------------------------------------
# THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)
# ------------------------------------------------------
input AddNodeInput {
litd: LitdInput
lnd: LndInput
name: String!
}
type AddNodeResult {
id: String!
name: String!
slug: String!
}
type AggregatedChannelForwards {
channel: String
channel_info: ChannelInfo
id: String!
incoming: AggregatedSideStats!
outgoing: AggregatedSideStats!
}
type AggregatedChannelSideForwards {
channel: String
channel_info: ChannelInfo
count: Float!
fee: Float!
fee_mtokens: String!
id: String!
mtokens: String!
tokens: Float!
}
type AggregatedRouteForwards {
count: Float!
fee: Float!
fee_mtokens: String!
id: String!
incoming_channel: String!
incoming_channel_info: ChannelInfo
mtokens: String!
outgoing_channel: String!
outgoing_channel_info: ChannelInfo
route: String!
tokens: Float!
}
type AggregatedSideStats {
count: Float!
fee: Float!
fee_mtokens: String!
id: String!
mtokens: String!
tokens: Float!
}
type AmbossSubscription {
end_date: String!
subscribed: Boolean!
upgradable: Boolean!
}
type AmbossUser {
backups: UserBackupInfo!
subscription: AmbossSubscription!
}
type AuthResponse {
message: String!
status: String!
}
type Balances {
lightning: LightningBalance!
onchain: OnChainBalance!
}
type BaseNodeInfo {
alias: String!
public_key: String!
}
type BitcoinFee {
fast: Float!
halfHour: Float!
hour: Float!
minimum: Float!
}
type BoltzInfoType {
feePercent: Float!
max: Float!
min: Float!
}
type ChainAddressSend {
confirmationCount: Float!
id: String!
isConfirmed: Boolean!
isOutgoing: Boolean!
tokens: Float
}
type ChainTransaction {
block_id: String
confirmation_count: Float
confirmation_height: Float
created_at: String!
description: String
fee: Float
id: String!
is_confirmed: Boolean!
is_outgoing: Boolean!
output_addresses: [String!]!
tokens: Float!
transaction: String
}
type Channel {
capacity: Float!
channel_age: Float!
commit_transaction_fee: Float!
commit_transaction_weight: Float!
id: String!
is_active: Boolean!
is_closing: Boolean!
is_opening: Boolean!
is_partner_initiated: Boolean!
is_private: Boolean!
local_balance: Float!
local_reserve: Float!
partner_fee_info: SingleChannel
partner_node_info: Node!
partner_public_key: String!
past_states: Float!
pending_payments: [PendingPayment!]!
pending_resume: PendingResume!
received: Float!
remote_balance: Float!
remote_reserve: Float!
sent: Float!
time_offline: Float
time_online: Float
transaction_id: String!
transaction_vout: Float!
unsettled_balance: Float!
}
type ChannelFeeHealth {
id: String
mySide: FeeHealth
partner: Node
partnerSide: FeeHealth
}
type ChannelHealth {
averageVolumeNormalized: String
id: String
partner: Node
score: Float
volumeNormalized: String
}
type ChannelInfo {
node1_info: BaseNodeInfo!
node2_info: BaseNodeInfo!
}
type ChannelReport {
commit: Float!
incomingPendingHtlc: Float!
local: Float!
maxIn: Float!
maxOut: Float!
outgoingPendingHtlc: Float!
remote: Float!
totalPendingHtlc: Float!
}
type ChannelRequest {
callback: String
k1: String
tag: String
uri: String
}
type ChannelTimeHealth {
id: String
monitoredDowntime: Float
monitoredTime: Float
monitoredUptime: Float
partner: Node
score: Float
significant: Boolean
}
type ChannelsFeeHealth {
channels: [ChannelFeeHealth!]
score: Float
}
type ChannelsHealth {
channels: [ChannelHealth!]
score: Float
}
type ChannelsTimeHealth {
channels: [ChannelTimeHealth!]
score: Float
}
type ClosedChannel {
capacity: Float!
channel_age: Float
close_confirm_height: Float
close_transaction_id: String
closed_for_blocks: Float
final_local_balance: Float!
final_time_locked_balance: Float!
id: String
is_breach_close: Boolean!
is_cooperative_close: Boolean!
is_funding_cancel: Boolean!
is_local_force_close: Boolean!
is_remote_force_close: Boolean!
partner_node_info: Node!
partner_public_key: String!
transaction_id: String!
transaction_vout: Float!
}
enum ConfigFields {
BACKUPS
CHANNELS_PUSH
HEALTHCHECKS
ONCHAIN_PUSH
PRIVATE_CHANNELS_PUSH
}
type ConfigState {
backup_state: Boolean!
channels_push_enabled: Boolean!
healthcheck_ping_state: Boolean!
onchain_push_enabled: Boolean!
private_channels_push_enabled: Boolean!
}
type CreateBoltzReverseSwapType {
decodedInvoice: DecodeInvoice
id: String!
invoice: String!
lockupAddress: String!
minerFeeInvoice: String
onchainAmount: Float!
preimage: String
preimageHash: String
privateKey: String
publicKey: String
receivingAddress: String!
redeemScript: String!
timeoutBlockHeight: Float!
}
type CreateInitialUserResult {
email: String!
id: String!
role: String!
}
type CreateInvoice {
chain_address: String
created_at: String!
description: String!
id: String!
mtokens: String
request: String!
secret: String!
tokens: Float
}
type CreateMacaroon {
base: String!
hex: String!
}
type DecodeInvoice {
chain_address: String
cltv_delta: Float
description: String!
description_hash: String
destination: String!
destination_node: Node
expires_at: String!
id: String!
mtokens: String!
payment: String
routes: [[Route!]!]!
safe_tokens: Float!
tokens: Float!
}
type DeleteNodeResult {
success: Boolean!
}
input EditNodeInput {
name: String
slug: String!
}
type EditNodeResult {
id: String!
name: String!
slug: String!
}
type FeeHealth {
base: String
baseOver: Boolean
baseScore: Float
rate: Float
rateOver: Boolean
rateScore: Float
score: Float
}
type Forward {
created_at: String!
fee: Float!
fee_mtokens: String!
id: String!
incoming_channel: String!
mtokens: String!
outgoing_channel: String!
tokens: Float!
}
type GetForwards {
by_channel: [AggregatedChannelForwards!]!
by_incoming: [AggregatedChannelSideForwards!]!
by_outgoing: [AggregatedChannelSideForwards!]!
by_route: [AggregatedRouteForwards!]!
list: [Forward!]!
}
type GetInvoicesType {
invoices: [InvoiceType!]!
next: String
}
type GetPaymentsType {
next: String
payments: [PaymentType!]!
}
type Hops {
channel: String!
channel_capacity: Float!
fee_mtokens: String!
forward_mtokens: String!
timeout: Float!
}
type InvoicePayment {
canceled_at: String
confirmed_at: String
created_at: String!
created_height: Float!
in_channel: String!
is_canceled: Boolean!
is_confirmed: Boolean!
is_held: Boolean!
messages: MessageType
mtokens: String!
pending_index: Float
timeout: Float!
tokens: Float!
total_mtokens: String
}
type InvoiceType {
chain_address: String
confirmed_at: String
created_at: String!
date: String!
description: String!
description_hash: String
expires_at: String!
id: String!
is_canceled: Boolean
is_confirmed: Boolean!
is_held: Boolean
is_private: Boolean!
is_push: Boolean
payments: [InvoicePayment!]!
received: Float!
received_mtokens: String!
request: String
secret: String!
tokens: String!
type: String!
}
type LightningBalance {
active: String!
commit: String!
confirmed: String!
pending: String!
}
type LightningNodeSocialInfo {
socials: NodeSocial
}
input LitdInput {
cert: String
macaroon: String!
socket: String!
}
union LnUrlRequest = ChannelRequest | PayRequest | WithdrawRequest
input LndInput {
cert: String
macaroon: String!
socket: String!
}
type MessageType {
message: String
}
type Mutation {
addPeer(isTemporary: Boolean, publicKey: String, socket: String, url: String): Boolean!
addTapAssetInvoice(input: TapAssetInvoiceInput!): TapAssetInvoiceResponse!
addTapFederationServer(host: String!): Boolean!
burnTapAsset(amount: Int!, assetId: String!): Boolean!
cancelTapBatch: Boolean!
claimBoltzTransaction(destination: String!, fee: Float!, id: String!, lockupAddress: String!, preimage: String!, privateKey: String!, redeem: String!): String!
closeChannel(forceClose: Boolean, id: String!, targetConfirmations: Float, tokensPerVByte: Float): OpenOrCloseChannel!
createAddress(type: String! = "p2tr"): String!
createBoltzReverseSwap(address: String, amount: Float!): CreateBoltzReverseSwapType!
createInvoice(amount: Float!, description: String, includePrivate: Boolean, secondsUntil: Float): CreateInvoice!
createMacaroon(permissions: NetworkInfoInput!): CreateMacaroon!
fetchLnUrl(url: String!): LnUrlRequest!
finalizeTapBatch: TapFinalizeBatchResponse!
fundTapAssetChannel(input: TapFundChannelInput!): TapFundChannelResponse!
keysend(destination: String, message: String, tokens: Float!): PayInvoice!
lnUrlAuth(url: String!): AuthResponse!
lnUrlChannel(callback: String!, k1: String!, uri: String!): String!
lnUrlPay(amount: Float!, callback: String!, comment: String): PaySuccess!
lnUrlWithdraw(amount: Float!, callback: String!, description: String, k1: String!): String!
loginAmboss: Boolean!
logout: Boolean!
mintTapAsset(amount: Int!, assetType: TapAssetType! = NORMAL, groupKey: String, grouped: Boolean = true, name: String!): TapMintResponse!
newTapAddress(amt: Int, assetId: String, groupKey: String): TapAddress!
openChannel(input: OpenChannelParams!): OpenOrCloseChannel!
pay(max_fee: Float!, max_paths: Float!, out: [String!], request: String!): Boolean!
public: PublicMutation!
purchaseLiquidity(amount_cents: String!): Boolean!
pushBackup: Boolean!
removePeer(publicKey: String): Boolean!
removeTapFederationServer(host: String!): Boolean!
removeTwofaSecret(token: String!): Boolean!
sendTapAsset(tapAddrs: [String!]!): Boolean!
sendToAddress(address: String!, fee: Float, sendAll: Boolean, target: Float, tokens: Float): ChainAddressSend!
setupTradePartner(input: SetupTradePartnerInput!): SetupTradePartnerResult!
syncTapUniverse(host: String!): TapSyncResult!
team: TeamMutations!
toggleConfig(field: ConfigFields!): Boolean!
updateFees(base_fee_tokens: Float, cltv_delta: Float, fee_rate: Float, max_htlc_mtokens: String, min_htlc_mtokens: String, transaction_id: String, transaction_vout: Float): Boolean!
updateMultipleFees(channels: [UpdateRoutingFeesParams!]!): Boolean!
updateTwofaSecret(secret: String!, token: String!): Boolean!
}
type NetworkInfo {
averageChannelSize: Float!
channelCount: Float!
maxChannelSize: Float!
medianChannelSize: Float!
minChannelSize: Float!
nodeCount: Float!
notRecentlyUpdatedPolicyCount: Float!
totalCapacity: Float!
}
input NetworkInfoInput {
is_ok_to_adjust_peers: Boolean!
is_ok_to_create_chain_addresses: Boolean!
is_ok_to_create_invoices: Boolean!
is_ok_to_create_macaroons: Boolean!
is_ok_to_derive_keys: Boolean!
is_ok_to_get_access_ids: Boolean!
is_ok_to_get_chain_transactions: Boolean!
is_ok_to_get_invoices: Boolean!
is_ok_to_get_payments: Boolean!
is_ok_to_get_peers: Boolean!
is_ok_to_get_wallet_info: Boolean!
is_ok_to_pay: Boolean!
is_ok_to_revoke_access_ids: Boolean!
is_ok_to_send_to_chain_addresses: Boolean!
is_ok_to_sign_bytes: Boolean!
is_ok_to_sign_messages: Boolean!
is_ok_to_stop_daemon: Boolean!
is_ok_to_verify_bytes_signatures: Boolean!
is_ok_to_verify_messages: Boolean!
}
type Node {
node: NodeType
}
type NodeCapabilities {
capabilities: [String!]!
}
type NodeInfo {
active_channels_count: Float!
alias: String!
chains: [String!]!
closed_channels_count: Float!
color: String!
current_block_hash: String!
current_block_height: Float!
is_synced_to_chain: Boolean!
is_synced_to_graph: Boolean!
latest_block_at: String!
latest_block_height: Float
peers_count: Float!
pending_channels_count: Float!
public_key: String!
uris: [String!]!
version: String!
}
type NodePolicy {
base_fee_mtokens: String
cltv_delta: Float
fee_rate: Float
is_disabled: Boolean
max_htlc_mtokens: String
min_htlc_mtokens: String
node: Node
updated_at: String
}
type NodeSocial {
info: NodeSocialInfo
}
type NodeSocialInfo {
email: String
private: Boolean
telegram: String
twitter: String
twitter_verified: Boolean
website: String
}
type NodeType {
alias: String!
public_key: String!
}
type OnChainBalance {
closing: String!
confirmed: String!
pending: String!
}
input OpenChannelParams {
base_fee_mtokens: String
chain_fee_tokens_per_vbyte: Float
channel_size: Float
fee_rate: Float
give_tokens: Float = 0
is_max_funding: Boolean
is_private: Boolean
is_recommended: Boolean
partner_public_key: String
}
type OpenOrCloseChannel {
transactionId: String!
transactionOutputIndex: String!
}
type PayInvoice {
fee: Float!
fee_mtokens: String!
hops: [Hops!]!
id: String!
is_confirmed: Boolean!
is_outgoing: Boolean!
mtokens: String!
safe_fee: Float!
safe_tokens: Float!
secret: String!
tokens: Float!
}
type PayRequest {
callback: String
commentAllowed: Float
maxSendable: String
metadata: String
minSendable: String
tag: String
}
type PaySuccess {
ciphertext: String
description: String
iv: String
message: String
tag: String
url: String
}
type PaymentType {
created_at: String!
date: String!
destination: String!
destination_node: Node!
fee: Float!
fee_mtokens: String!
hops: [Node!]!
id: String!
index: Float
is_confirmed: Boolean!
is_outgoing: Boolean!
mtokens: String!
request: String
safe_fee: Float!
safe_tokens: Float
secret: String!
tokens: String!
type: String!
}
type Peer {
bytes_received: Float!
bytes_sent: Float!
is_inbound: Boolean!
is_sync_peer: Boolean
partner_node_info: Node!
ping_time: Float!
public_key: String!
socket: String!
tokens_received: Float!
tokens_sent: Float!
}
type PendingChannel {
close_transaction_id: String
is_active: Boolean!
is_closing: Boolean!
is_opening: Boolean!
is_timelocked: Boolean!
local_balance: Float!
local_reserve: Float!
partner_node_info: Node!
partner_public_key: String!
received: Float!
remote_balance: Float!
remote_reserve: Float!
sent: Float!
timelock_blocks: Float
timelock_expiration: Float
transaction_fee: Float
transaction_id: String!
transaction_vout: Float!
}
type PendingPayment {
id: String!
is_outgoing: Boolean!
timeout: Float!
tokens: Float!
}
type PendingResume {
incoming_amount: Float!
incoming_tokens: Float!
outgoing_amount: Float!
outgoing_tokens: Float!
total_amount: Float!
total_tokens: Float!
}
type Policy {
base_fee_mtokens: String
cltv_delta: Float
fee_rate: Float
is_disabled: Boolean
max_htlc_mtokens: String
min_htlc_mtokens: String
public_key: String!
updated_at: String
}
type PublicMutation {
create_initial_user(email: String!, password: String!): CreateInitialUserResult!
get_auth_token(cookie: String): Boolean!
get_db_session_token(email: String!, password: String!): Boolean!
get_session_token(id: String!, password: String!, token: String): String!
}
type PublicQueries {
get_server_accounts: [ServerAccount!]!
}
type Query {
decodeTapAddress(addr: String!): TapAddress!
getAccount: ServerAccount!
getAmbossLoginToken(redirect_url: String): String!
getAmbossUser: AmbossUser
getBackups: String!
getBitcoinFees: BitcoinFee!
getBitcoinPrice: String!
getBoltzInfo: BoltzInfoType!
getChainTransactions: [ChainTransaction!]!
getChannel(id: String!): SingleChannel!
getChannelReport: ChannelReport!
getChannels(active: Boolean, partner_public_key: String): [Channel!]!
getClosedChannels: [ClosedChannel!]!
getConfigState: ConfigState!
getFeeHealth: ChannelsFeeHealth!
getForwards(days: Float!): GetForwards!
getHello: String!
getInvoiceStatusChange(id: String!): String!
getInvoices(token: String): GetInvoicesType!
getLatestVersion: String!
getLightningAddressInfo(address: String!): PayRequest!
getLiquidityPerUsd: String!
getNetworkInfo: NetworkInfo!
getNode(publicKey: String!, withoutChannels: Boolean): Node!
getNodeBalances: Balances!
getNodeCapabilities: NodeCapabilities!
getNodeInfo: NodeInfo!
getNodeSocialInfo(pubkey: String!): LightningNodeSocialInfo!
getPayments(token: String): GetPaymentsType!
getPeers: [Peer!]!
getPendingChannels: [PendingChannel!]!
getTapAssets: TapAssetList!
getTapBalances(groupBy: TapBalanceGroupBy = GROUP_KEY): TapBalances!
getTapFederationServers: TapFederationServerList!
getTapOffers(assetId: String!, limit: Int, minAmount: String, offset: Int, sortBy: TapOfferSortBy, sortDir: TapOfferSortDir, transactionType: TapTransactionType!): TapTradeOfferList!
getTapSupportedAssets: TapSupportedAssetList!
getTapTransfers: TapTransferList!
getTapUniverseAssets: TapUniverseAssetList!
getTapUniverseInfo: TapUniverseInfo!
getTapUniverseStats: TapUniverseStats!
getTimeHealth: ChannelsTimeHealth!
getTwofaSecret: TwofaResult!
getUtxos: [Utxo!]!
getVolumeHealth: ChannelsHealth!
getWalletInfo: Wallet!
public: PublicQueries!
recoverFunds(backup: String!): Boolean!
signMessage(message: String!): String!
user: UserQueries!
verifyBackup(backup: String!): Boolean!
verifyBackups(backup: String!): Boolean!
verifyMessage(message: String!, signature: String!): String!
}
type Route {
base_fee_mtokens: String
channel: String
cltv_delta: Float
fee_rate: Float
public_key: String!
}
type ServerAccount {
hasNode: Boolean
id: String!
loggedIn: Boolean!
name: String!
slug: String!
twofaEnabled: Boolean!
type: String!
}
input SetupTradePartnerInput {
amount: String!
assetId: String!
assetRate: String!
magmaOfferId: String!
swapNodePubkey: String!
swapNodeSockets: [String!]
transactionType: TapTransactionType!
}
type SetupTradePartnerResult {
magmaOrderAmountAsset: String
magmaOrderAmountSats: String
magmaOrderFeeSats: String
magmaOrderId: String
magmaOrderStatus: String
outboundChannelOutputIndex: Int
outboundChannelTxid: String
success: Boolean!
}
type SingleChannel {
capacity: Float!
id: String!
node_policies: NodePolicy
partner_node_policies: NodePolicy
policies: [Policy!]!
transaction_id: String!
transaction_vout: Float!
updated_at: String
}
type TapAddress {
amount: String!
assetId: String!
assetType: String!
encoded: String!
groupKey: String
internalKey: String!
scriptKey: String!
taprootOutputKey: String!
}
type TapAsset {
amount: String!
assetGenesis: TapAssetGenesis
isBurn: Boolean!
isSpent: Boolean!
lockTime: Int!
relativeLockTime: Int!
scriptKey: String!
scriptVersion: Int!
}
type TapAssetBalanceEntry {
assetId: String
balance: String!
groupKey: String
names: [String!]
}
type TapAssetGenesis {
assetId: String!
assetType: TapAssetType!
genesisPoint: String!
metaHash: String!
name: String!
outputIndex: Int!
}
input TapAssetInvoiceInput {
assetAmount: String!
assetId: String
expiry: Int
groupKey: String
memo: String
peerPubkey: String
}
type TapAssetInvoiceResponse {
addIndex: String!
assetAmount: String!
assetId: String
groupKey: String
paymentAddr: String!
paymentRequest: String!
rHash: String!
}
type TapAssetList {
assets: [TapAsset!]!
}
type TapAssetPrice {
id: String
usd: Float
}
enum TapAssetType {
COLLECTIBLE
NORMAL
}
enum TapBalanceGroupBy {
ASSET_ID
GROUP_KEY
}
type TapBalances {
balances: [TapAssetBalanceEntry!]!
}
type TapFederationServer {
host: String!
id: Int!
}
type TapFederationServerList {
nodeAddress: String
servers: [TapFederationServer!]!
}
type TapFinalizeBatchResponse {
batchKey: String!
}
input TapFundChannelInput {
assetAmount: String!
assetId: String
feeRateSatPerVbyte: Int
groupKey: String
peerPubkey: String!
pushSat: Int
}
type TapFundChannelResponse {
outputIndex: Int!
txid: String!
}
type TapMintResponse {
batchKey: String!
}
enum TapOfferSortBy {
AVAILABLE
RATE
}
enum TapOfferSortDir {
ASC
DESC
}
type TapSupportedAsset {
assetId: String
description: String
groupKey: String
id: String!
precision: Int!
prices: TapAssetPrice
symbol: String!
}
type TapSupportedAssetList {
list: [TapSupportedAsset!]!
totalCount: Float!
}
type TapSyncResult {
syncedUniverses: [String!]!
}
type TapTradeOffer {
available: TapTradeOfferAmount!
id: String!
magmaOfferId: String!
node: TapTradeOfferNode!
rate: TapTradeOfferAmount!
}
type TapTradeOfferAmount {
displayAmount: String
fullAmount: String
}
type TapTradeOfferList {
list: [TapTradeOffer!]!
totalCount: Float!
}
type TapTradeOfferNode {
alias: String
pubkey: String
sockets: [String!]!
}
enum TapTransactionType {
PURCHASE
SALE
}
type TapTransfer {
anchorTxChainFees: String!
anchorTxHash: String!
anchorTxHeightHint: Int!
inputs: [TapTransferInput!]!
label: String!
outputs: [TapTransferOutput!]!
transferTimestamp: String!
}
type TapTransferInput {
amount: String!
anchorPoint: String!
assetId: String!
}
type TapTransferList {
transfers: [TapTransfer!]!
}
type TapTransferOutput {
amount: String!
assetId: String!
outputType: String!
scriptKeyIsLocal: Boolean!
}
type TapUniverseAsset {
assetId: String
groupKey: String
name: String
proofType: String!
totalSupply: String!
}
type TapUniverseAssetList {
assets: [TapUniverseAsset!]!
}
type TapUniverseInfo {
runtimeId: String!
}
type TapUniverseStats {
numTotalAssets: Int!
numTotalGroups: Int!
numTotalProofs: Int!
numTotalSyncs: Int!
}
type TeamMutations {
add_node(input: AddNodeInput!): AddNodeResult!
delete_node(slug: String!): DeleteNodeResult!
edit_node(input: EditNodeInput!): EditNodeResult!
}
type TwofaResult {
secret: String!
url: String!
}
input UpdateRoutingFeesParams {
base_fee_mtokens: String
base_fee_tokens: Float
cltv_delta: Float
fee_rate: Float
max_htlc_mtokens: String
min_htlc_mtokens: String
transaction_id: String
transaction_vout: Float
}
type UserBackupInfo {
last_update: String
last_update_size: String
total_size_saved: String!
}
type UserNode {
id: String!
name: String!
slug: String!
}
type UserQueries {
get_nodes: [UserNode!]!
}
type Utxo {
address: String!
address_format: String!
confirmation_count: Float!
output_script: String!
tokens: Float!
transaction_id: String!
transaction_vout: Float!
}
type Wallet {
build_tags: [String!]!
commit_hash: String!
is_autopilotrpc_enabled: Boolean!
is_chainrpc_enabled: Boolean!
is_invoicesrpc_enabled: Boolean!
is_signrpc_enabled: Boolean!
is_walletrpc_enabled: Boolean!
is_watchtowerrpc_enabled: Boolean!
is_wtclientrpc_enabled: Boolean!
}
type WithdrawRequest {
callback: String
defaultDescription: String
k1: String
maxWithdrawable: String
minWithdrawable: String
tag: String
}