From 96a8311c842e3f44332ca86b307e8ae4d665b044 Mon Sep 17 00:00:00 2001 From: dkijania Date: Wed, 27 May 2026 11:39:50 +0200 Subject: [PATCH 1/2] Fix GET_ACCOUNT_WITH_TOKEN type + refresh schema snapshot - GET_ACCOUNT_WITH_TOKEN: change `$token: UInt64!` to `$token: TokenId!`. The Mina daemon's account(token:) field has always expected a TokenId scalar. The drift check (added in the follow-up PR) catches this against a live lightnet daemon. - src/mina_sdk/schema/graphql_schema.json: regenerated against devnet. The previous snapshot was stale by ~49 introspection diffs (mostly ofType nullability normalization on list-typed fields). No SDK behavior change; only a fresh local schema for the drift checker to compare against. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/mina_sdk/daemon/queries.py | 2 +- src/mina_sdk/schema/graphql_schema.json | 1823 +++++++++++++---------- 2 files changed, 1055 insertions(+), 770 deletions(-) diff --git a/src/mina_sdk/daemon/queries.py b/src/mina_sdk/daemon/queries.py index 159cb9a..5115740 100644 --- a/src/mina_sdk/daemon/queries.py +++ b/src/mina_sdk/daemon/queries.py @@ -47,7 +47,7 @@ """ GET_ACCOUNT_WITH_TOKEN = """ -query ($publicKey: PublicKey!, $token: UInt64!) { +query ($publicKey: PublicKey!, $token: TokenId!) { account(publicKey: $publicKey, token: $token) { publicKey nonce diff --git a/src/mina_sdk/schema/graphql_schema.json b/src/mina_sdk/schema/graphql_schema.json index 9555dd4..507a81b 100644 --- a/src/mina_sdk/schema/graphql_schema.json +++ b/src/mina_sdk/schema/graphql_schema.json @@ -1,9 +1,15 @@ { "data": { "__schema": { - "queryType": { "name": "query" }, - "mutationType": { "name": "mutation" }, - "subscriptionType": { "name": "subscription" }, + "queryType": { + "name": "query" + }, + "mutationType": { + "name": "mutation" + }, + "subscriptionType": { + "name": "subscription" + }, "types": [ { "kind": "ENUM", @@ -29,8 +35,7 @@ "fields": [ { "name": "newSyncUpdate", - "description": - "Event that triggers when the network sync status changes", + "description": "Event that triggers when the network sync status changes", "args": [], "type": { "kind": "NON_NULL", @@ -46,8 +51,7 @@ }, { "name": "newBlock", - "description": - "Event that triggers when a new block is created that either contains a transaction with the specified public key, or was produced by it. If no public key is provided, then the event will trigger for every new block received", + "description": "Event that triggers when a new block is created that either contains a transaction with the specified public key, or was produced by it. If no public key is provided, then the event will trigger for every new block received", "args": [ { "name": "publicKey", @@ -74,8 +78,7 @@ }, { "name": "chainReorganization", - "description": - "Event that triggers when the best tip changes in a way that is not a trivial extension of the existing one", + "description": "Event that triggers when the best tip changes in a way that is not a trivial extension of the existing one", "args": [], "type": { "kind": "NON_NULL", @@ -192,8 +195,7 @@ { "kind": "INPUT_OBJECT", "name": "NetworkPeer", - "description": - "Network identifiers for another protocol participant", + "description": "Network identifiers for another protocol participant", "fields": [ { "name": "libp2pPort", @@ -202,7 +204,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -247,7 +253,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "defaultValue": null }, @@ -291,17 +301,19 @@ "fields": [ { "name": "cleanAddedPeers", - "description": - "If true, resets added peers to an empty list (including seeds)", + "description": "If true, resets added peers to an empty list (including seeds)", "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "isolate", - "description": - "If true, no connections will be allowed unless they are from a trusted peer", + "description": "If true, no connections will be allowed unless they are from a trusted peer", "args": [], "type": { "kind": "NON_NULL", @@ -317,8 +329,7 @@ }, { "name": "bannedPeers", - "description": - "Peers we will never allow connections from (unless they are also trusted!)", + "description": "Peers we will never allow connections from (unless they are also trusted!)", "args": [], "type": { "kind": "NON_NULL", @@ -331,8 +342,7 @@ "name": null, "ofType": { "kind": "INPUT_OBJECT", - "name": "NetworkPeer", - "ofType": null + "name": "NetworkPeer" } } } @@ -355,8 +365,7 @@ "name": null, "ofType": { "kind": "INPUT_OBJECT", - "name": "NetworkPeer", - "ofType": null + "name": "NetworkPeer" } } } @@ -368,15 +377,17 @@ "inputFields": [ { "name": "cleanAddedPeers", - "description": - "If true, resets added peers to an empty list (including seeds)", - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "description": "If true, resets added peers to an empty list (including seeds)", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "defaultValue": null }, { "name": "isolate", - "description": - "If true, no connections will be allowed unless they are from a trusted peer", + "description": "If true, no connections will be allowed unless they are from a trusted peer", "type": { "kind": "NON_NULL", "name": null, @@ -390,8 +401,7 @@ }, { "name": "bannedPeers", - "description": - "Peers we will never allow connections from (unless they are also trusted!)", + "description": "Peers we will never allow connections from (unless they are also trusted!)", "type": { "kind": "NON_NULL", "name": null, @@ -403,8 +413,7 @@ "name": null, "ofType": { "kind": "INPUT_OBJECT", - "name": "NetworkPeer", - "ofType": null + "name": "NetworkPeer" } } } @@ -425,8 +434,7 @@ "name": null, "ofType": { "kind": "INPUT_OBJECT", - "name": "NetworkPeer", - "ofType": null + "name": "NetworkPeer" } } } @@ -492,7 +500,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -510,8 +522,7 @@ "fields": [ { "name": "publicKey", - "description": - "Public key you wish to start snark-working on; null to stop doing any snark work. Warning: If the key is from a zkApp account, the account's receive permission must be None.", + "description": "Public key you wish to start snark-working on; null to stop doing any snark work. Warning: If the key is from a zkApp account, the account's receive permission must be None.", "args": [], "type": { "kind": "SCALAR", @@ -525,8 +536,7 @@ "inputFields": [ { "name": "publicKey", - "description": - "Public key you wish to start snark-working on; null to stop doing any snark work. Warning: If the key is from a zkApp account, the account's receive permission must be None.", + "description": "Public key you wish to start snark-working on; null to stop doing any snark work. Warning: If the key is from a zkApp account, the account's receive permission must be None.", "type": { "kind": "SCALAR", "name": "PublicKey", @@ -546,8 +556,7 @@ "fields": [ { "name": "lastSnarkWorker", - "description": - "Returns the last public key that was designated for snark work", + "description": "Returns the last public key that was designated for snark work", "args": [], "type": { "kind": "SCALAR", @@ -570,8 +579,7 @@ "fields": [ { "name": "publicKey", - "description": - "Public key of the account to receive coinbases. Block production keys will receive the coinbases if omitted. Warning: If the key is from a zkApp account, the account's receive permission must be None.", + "description": "Public key of the account to receive coinbases. Block production keys will receive the coinbases if omitted. Warning: If the key is from a zkApp account, the account's receive permission must be None.", "args": [], "type": { "kind": "SCALAR", @@ -585,8 +593,7 @@ "inputFields": [ { "name": "publicKey", - "description": - "Public key of the account to receive coinbases. Block production keys will receive the coinbases if omitted. Warning: If the key is from a zkApp account, the account's receive permission must be None.", + "description": "Public key of the account to receive coinbases. Block production keys will receive the coinbases if omitted. Warning: If the key is from a zkApp account, the account's receive permission must be None.", "type": { "kind": "SCALAR", "name": "PublicKey", @@ -606,8 +613,7 @@ "fields": [ { "name": "lastCoinbaseReceiver", - "description": - "Returns the public key that was receiving coinbases previously, or none if it was the block producer", + "description": "Returns the public key that was receiving coinbases previously, or none if it was the block producer", "args": [], "type": { "kind": "SCALAR", @@ -619,8 +625,7 @@ }, { "name": "currentCoinbaseReceiver", - "description": - "Returns the public key that will receive coinbase, or none if it will be the block producer", + "description": "Returns the public key that will receive coinbase, or none if it will be the block producer", "args": [], "type": { "kind": "SCALAR", @@ -728,7 +733,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -783,7 +792,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "defaultValue": null }, @@ -1661,7 +1674,11 @@ "name": "zkappUri", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -1669,7 +1686,11 @@ "name": "tokenSymbol", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -1750,13 +1771,21 @@ { "name": "zkappUri", "description": null, - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "defaultValue": null }, { "name": "tokenSymbol", "description": null, - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "defaultValue": null }, { @@ -1937,7 +1966,11 @@ "name": "hash", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -1958,7 +1991,11 @@ { "name": "hash", "description": null, - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "defaultValue": null }, { @@ -2073,7 +2110,11 @@ "name": "seed", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -2081,7 +2122,11 @@ "name": "startCheckpoint", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -2089,7 +2134,11 @@ "name": "lockCheckpoint", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -2124,19 +2173,31 @@ { "name": "seed", "description": null, - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "defaultValue": null }, { "name": "startCheckpoint", "description": null, - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "defaultValue": null }, { "name": "lockCheckpoint", "description": null, - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "defaultValue": null }, { @@ -2163,7 +2224,11 @@ "name": "snarkedLedgerHash", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -2252,7 +2317,11 @@ { "name": "snarkedLedgerHash", "description": null, - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "defaultValue": null }, { @@ -2505,7 +2574,11 @@ "name": "receiptChainHash", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -2545,7 +2618,11 @@ "name": "actionState", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -2553,7 +2630,11 @@ "name": "provedState", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -2561,7 +2642,11 @@ "name": "isNew", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null } @@ -2590,7 +2675,11 @@ { "name": "receiptChainHash", "description": null, - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "defaultValue": null }, { @@ -2624,19 +2713,31 @@ { "name": "actionState", "description": null, - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "defaultValue": null }, { "name": "provedState", "description": null, - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "defaultValue": null }, { "name": "isNew", "description": null, - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "defaultValue": null } ], @@ -3084,16 +3185,7 @@ "name": null, "ofType": { "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Field", - "ofType": null - } - } + "name": null } } } @@ -3116,16 +3208,7 @@ "name": null, "ofType": { "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Field", - "ofType": null - } - } + "name": null } } } @@ -3156,7 +3239,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -3327,16 +3414,7 @@ "name": null, "ofType": { "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Field", - "ofType": null - } - } + "name": null } } } @@ -3357,16 +3435,7 @@ "name": null, "ofType": { "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Field", - "ofType": null - } - } + "name": null } } } @@ -3393,7 +3462,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "defaultValue": null }, @@ -3636,8 +3709,7 @@ "name": null, "ofType": { "kind": "INPUT_OBJECT", - "name": "ZkappAccountUpdateInput", - "ofType": null + "name": "ZkappAccountUpdateInput" } } } @@ -3691,8 +3763,7 @@ "name": null, "ofType": { "kind": "INPUT_OBJECT", - "name": "ZkappAccountUpdateInput", - "ofType": null + "name": "ZkappAccountUpdateInput" } } } @@ -3725,8 +3796,7 @@ "fields": [ { "name": "zkappCommand", - "description": - "zkApp command structure representing the transaction", + "description": "zkApp command structure representing the transaction", "args": [], "type": { "kind": "NON_NULL", @@ -3744,8 +3814,7 @@ "inputFields": [ { "name": "zkappCommand", - "description": - "zkApp command structure representing the transaction", + "description": "zkApp command structure representing the transaction", "type": { "kind": "NON_NULL", "name": null, @@ -3796,10 +3865,13 @@ "fields": [ { "name": "nonce", - "description": - "Should only be set when cancelling transactions, otherwise a nonce is determined automatically", + "description": "Should only be set when cancelling transactions, otherwise a nonce is determined automatically", "args": [], - "type": { "kind": "SCALAR", "name": "UInt32", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "UInt32", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -3807,16 +3879,23 @@ "name": "memo", "description": "Short arbitrary message provided by the sender", "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "validUntil", - "description": - "The global slot since genesis after which this transaction cannot be applied", + "description": "The global slot since genesis after which this transaction cannot be applied", "args": [], - "type": { "kind": "SCALAR", "name": "UInt32", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "UInt32", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -3872,22 +3951,32 @@ "inputFields": [ { "name": "nonce", - "description": - "Should only be set when cancelling transactions, otherwise a nonce is determined automatically", - "type": { "kind": "SCALAR", "name": "UInt32", "ofType": null }, + "description": "Should only be set when cancelling transactions, otherwise a nonce is determined automatically", + "type": { + "kind": "SCALAR", + "name": "UInt32", + "ofType": null + }, "defaultValue": null }, { "name": "memo", "description": "Short arbitrary message provided by the sender", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "defaultValue": null }, { "name": "validUntil", - "description": - "The global slot since genesis after which this transaction cannot be applied", - "type": { "kind": "SCALAR", "name": "UInt32", "ofType": null }, + "description": "The global slot since genesis after which this transaction cannot be applied", + "type": { + "kind": "SCALAR", + "name": "UInt32", + "ofType": null + }, "defaultValue": null }, { @@ -4490,8 +4579,7 @@ "fields": [ { "name": "addWallet", - "description": - "Add a wallet - this will create a new keypair and store it in the daemon", + "description": "Add a wallet - this will create a new keypair and store it in the daemon", "args": [ { "name": "input", @@ -4522,8 +4610,7 @@ }, { "name": "startFilteredLog", - "description": - "TESTING ONLY: Start filtering and recording all structured events in memory", + "description": "TESTING ONLY: Start filtering and recording all structured events in memory", "args": [ { "name": "filter", @@ -4539,8 +4626,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "String", - "ofType": null + "name": "String" } } } @@ -4562,8 +4648,7 @@ }, { "name": "createAccount", - "description": - "Create a new account - this will create a new keypair and store it in the daemon", + "description": "Create a new account - this will create a new keypair and store it in the daemon", "args": [ { "name": "input", @@ -4594,8 +4679,7 @@ }, { "name": "createHDAccount", - "description": - "Create an account with hardware wallet - this will let the hardware wallet generate a keypair corresponds to the HD-index you give and store this HD-index and the generated public key in the daemon. Calling this command with the same HD-index and the same hardware wallet will always generate the same keypair.", + "description": "Create an account with hardware wallet - this will let the hardware wallet generate a keypair corresponds to the HD-index you give and store this HD-index and the generated public key in the daemon. Calling this command with the same HD-index and the same hardware wallet will always generate the same keypair.", "args": [ { "name": "input", @@ -4626,8 +4710,7 @@ }, { "name": "unlockAccount", - "description": - "Allow transactions to be sent from the unlocked account", + "description": "Allow transactions to be sent from the unlocked account", "args": [ { "name": "input", @@ -4658,8 +4741,7 @@ }, { "name": "unlockWallet", - "description": - "Allow transactions to be sent from the unlocked account", + "description": "Allow transactions to be sent from the unlocked account", "args": [ { "name": "input", @@ -4690,8 +4772,7 @@ }, { "name": "lockAccount", - "description": - "Lock an unlocked account to prevent transaction being sent from it", + "description": "Lock an unlocked account to prevent transaction being sent from it", "args": [ { "name": "input", @@ -4722,8 +4803,7 @@ }, { "name": "lockWallet", - "description": - "Lock an unlocked account to prevent transaction being sent from it", + "description": "Lock an unlocked account to prevent transaction being sent from it", "args": [ { "name": "input", @@ -4754,8 +4834,7 @@ }, { "name": "deleteAccount", - "description": - "Delete the private key for an account that you track", + "description": "Delete the private key for an account that you track", "args": [ { "name": "input", @@ -4786,8 +4865,7 @@ }, { "name": "deleteWallet", - "description": - "Delete the private key for an account that you track", + "description": "Delete the private key for an account that you track", "args": [ { "name": "input", @@ -4852,8 +4930,7 @@ }, { "name": "path", - "description": - "Path to the wallet file, relative to the daemon's current working directory.", + "description": "Path to the wallet file, relative to the daemon's current working directory.", "type": { "kind": "NON_NULL", "name": null, @@ -4900,8 +4977,7 @@ "args": [ { "name": "signature", - "description": - "If a signature is provided, this transaction is considered signed and will be broadcasted to the network without requiring a private key", + "description": "If a signature is provided, this transaction is considered signed and will be broadcasted to the network without requiring a private key", "type": { "kind": "INPUT_OBJECT", "name": "SignatureInput", @@ -4942,8 +5018,7 @@ "args": [ { "name": "repeat_delay_ms", - "description": - "Delay with which a transaction shall be repeated", + "description": "Delay with which a transaction shall be repeated", "type": { "kind": "NON_NULL", "name": null, @@ -4957,8 +5032,7 @@ }, { "name": "repeat_count", - "description": - "How many times shall transaction be repeated", + "description": "How many times shall transaction be repeated", "type": { "kind": "NON_NULL", "name": null, @@ -5014,8 +5088,7 @@ }, { "name": "senders", - "description": - "The private keys from which to sign the payments", + "description": "The private keys from which to sign the payments", "type": { "kind": "NON_NULL", "name": null, @@ -5027,8 +5100,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "PrivateKey", - "ofType": null + "name": "PrivateKey" } } } @@ -5039,7 +5111,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -5050,8 +5126,7 @@ "args": [ { "name": "signature", - "description": - "If a signature is provided, this transaction is considered signed and will be broadcasted to the network without requiring a private key", + "description": "If a signature is provided, this transaction is considered signed and will be broadcasted to the network without requiring a private key", "type": { "kind": "INPUT_OBJECT", "name": "SignatureInput", @@ -5119,8 +5194,7 @@ }, { "name": "mockZkapp", - "description": - "Mock a zkApp transaction, no effect on blockchain", + "description": "Mock a zkApp transaction, no effect on blockchain", "args": [ { "name": "input", @@ -5151,8 +5225,7 @@ }, { "name": "internalSendZkapp", - "description": - "Send zkApp transactions (for internal testing purposes)", + "description": "Send zkApp transactions (for internal testing purposes)", "args": [ { "name": "zkappCommands", @@ -5168,8 +5241,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "SendTestZkappInput", - "ofType": null + "name": "SendTestZkappInput" } } } @@ -5188,8 +5260,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "SendZkappPayload", - "ofType": null + "name": "SendZkappPayload" } } } @@ -5257,8 +5328,7 @@ }, { "name": "setSnarkWorker", - "description": - "Set key you wish to snark work with or disable snark working", + "description": "Set key you wish to snark work with or disable snark working", "args": [ { "name": "input", @@ -5289,8 +5359,7 @@ }, { "name": "setSnarkWorkFee", - "description": - "Set fee that you will like to receive for doing snark work", + "description": "Set fee that you will like to receive for doing snark work", "args": [ { "name": "input", @@ -5321,8 +5390,7 @@ }, { "name": "setConnectionGatingConfig", - "description": - "Set the connection gating config, returning the current config after the application (which may have failed)", + "description": "Set the connection gating config, returning the current config after the application (which may have failed)", "args": [ { "name": "input", @@ -5379,8 +5447,7 @@ "name": null, "ofType": { "kind": "INPUT_OBJECT", - "name": "NetworkPeer", - "ofType": null + "name": "NetworkPeer" } } } @@ -5399,8 +5466,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Peer", - "ofType": null + "name": "Peer" } } } @@ -5507,8 +5573,7 @@ "args": [ { "name": "input", - "description": - "Proof bundle for a given spec in json format including fees and prover public key", + "description": "Proof bundle for a given spec in json format including fees and prover public key", "type": { "kind": "NON_NULL", "name": null, @@ -5559,16 +5624,7 @@ "name": null, "ofType": { "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "FieldElem", - "ofType": null - } - } + "name": null } } } @@ -5583,7 +5639,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -5595,7 +5655,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -5677,8 +5741,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "String", - "ofType": null + "name": "String" } } } @@ -5776,8 +5839,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "String", - "ofType": null + "name": "String" } } } @@ -5852,13 +5914,16 @@ "fields": [ { "name": "delegatorIndex", - "description": - "Position in the ledger of the delegator's account", + "description": "Position in the ledger of the delegator's account", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -5899,12 +5964,15 @@ "inputFields": [ { "name": "delegatorIndex", - "description": - "Position in the ledger of the delegator's account", + "description": "Position in the ledger of the delegator's account", "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "defaultValue": null }, @@ -5944,13 +6012,11 @@ { "kind": "INPUT_OBJECT", "name": "VrfThresholdInput", - "description": - "The amount of stake delegated, used to determine the threshold for a vrf evaluation producing a block", + "description": "The amount of stake delegated, used to determine the threshold for a vrf evaluation producing a block", "fields": [ { "name": "totalStake", - "description": - "The total amount of stake across all accounts in the epoch's staking ledger.", + "description": "The total amount of stake across all accounts in the epoch's staking ledger.", "args": [], "type": { "kind": "NON_NULL", @@ -5966,8 +6032,7 @@ }, { "name": "delegatedStake", - "description": - "The amount of stake delegated to the vrf evaluator by the delegating account. This should match the amount in the epoch's staking ledger, which may be different to the amount in the current ledger.", + "description": "The amount of stake delegated to the vrf evaluator by the delegating account. This should match the amount in the epoch's staking ledger, which may be different to the amount in the current ledger.", "args": [], "type": { "kind": "NON_NULL", @@ -5985,8 +6050,7 @@ "inputFields": [ { "name": "totalStake", - "description": - "The total amount of stake across all accounts in the epoch's staking ledger.", + "description": "The total amount of stake across all accounts in the epoch's staking ledger.", "type": { "kind": "NON_NULL", "name": null, @@ -6000,8 +6064,7 @@ }, { "name": "delegatedStake", - "description": - "The amount of stake delegated to the vrf evaluator by the delegating account. This should match the amount in the epoch's staking ledger, which may be different to the amount in the current ledger.", + "description": "The amount of stake delegated to the vrf evaluator by the delegating account. This should match the amount in the epoch's staking ledger, which may be different to the amount in the current ledger.", "type": { "kind": "NON_NULL", "name": null, @@ -6031,13 +6094,11 @@ { "kind": "OBJECT", "name": "VrfThreshold", - "description": - "The amount of stake delegated, used to determine the threshold for a vrf evaluation winning a slot", + "description": "The amount of stake delegated, used to determine the threshold for a vrf evaluation winning a slot", "fields": [ { "name": "delegatedStake", - "description": - "The amount of stake delegated to the vrf evaluator by the delegating account. This should match the amount in the epoch's staking ledger, which may be different to the amount in the current ledger.", + "description": "The amount of stake delegated to the vrf evaluator by the delegating account. This should match the amount in the epoch's staking ledger, which may be different to the amount in the current ledger.", "args": [], "type": { "kind": "NON_NULL", @@ -6053,8 +6114,7 @@ }, { "name": "totalStake", - "description": - "The total amount of stake across all accounts in the epoch's staking ledger.", + "description": "The total amount of stake across all accounts in the epoch's staking ledger.", "args": [], "type": { "kind": "NON_NULL", @@ -6123,13 +6183,16 @@ }, { "name": "delegatorIndex", - "description": - "Position in the ledger of the delegator's account", + "description": "Position in the ledger of the delegator's account", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -6143,8 +6206,7 @@ { "kind": "OBJECT", "name": "VrfEvaluation", - "description": - "A witness to a vrf evaluation, which may be externally verified", + "description": "A witness to a vrf evaluation, which may be externally verified", "fields": [ { "name": "message", @@ -6212,8 +6274,7 @@ }, { "name": "scaledMessageHash", - "description": - "A group element represented as 2 field elements", + "description": "A group element represented as 2 field elements", "args": [], "type": { "kind": "NON_NULL", @@ -6226,8 +6287,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "String", - "ofType": null + "name": "String" } } } @@ -6249,8 +6309,7 @@ }, { "name": "vrfOutput", - "description": - "The vrf output derived from the evaluation witness. If null, the vrf witness was invalid.", + "description": "The vrf output derived from the evaluation witness. If null, the vrf witness was invalid.", "args": [], "type": { "kind": "SCALAR", @@ -6262,17 +6321,19 @@ }, { "name": "vrfOutputFractional", - "description": - "The vrf output derived from the evaluation witness, as a fraction. This represents a won slot if vrfOutputFractional <= (1 - (1 / 4)^(delegated_balance / total_stake)). If null, the vrf witness was invalid.", + "description": "The vrf output derived from the evaluation witness, as a fraction. This represents a won slot if vrfOutputFractional <= (1 - (1 / 4)^(delegated_balance / total_stake)). If null, the vrf witness was invalid.", "args": [], - "type": { "kind": "SCALAR", "name": "Float", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "thresholdMet", - "description": - "Whether the threshold to produce a block was met, if specified", + "description": "Whether the threshold to produce a block was met, if specified", "args": [ { "name": "input", @@ -6285,7 +6346,11 @@ "defaultValue": null } ], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null } @@ -6298,14 +6363,17 @@ { "kind": "INPUT_OBJECT", "name": "SignatureInput", - "description": - "A cryptographic signature -- you must provide either field+scalar or rawSignature", + "description": "A cryptographic signature -- you must provide either field+scalar or rawSignature", "fields": [ { "name": "rawSignature", "description": "Raw encoded signature", "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -6313,7 +6381,11 @@ "name": "scalar", "description": "Scalar component of signature", "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -6321,7 +6393,11 @@ "name": "field", "description": "Field component of signature", "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null } @@ -6330,21 +6406,33 @@ { "name": "rawSignature", "description": "Raw encoded signature", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "defaultValue": null }, { "name": "scalar", "description": "Scalar component of signature", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "defaultValue": null }, { "name": "field", "description": "Field component of signature", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, - "defaultValue": null - } + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + } ], "interfaces": null, "enumValues": null, @@ -6353,8 +6441,7 @@ { "kind": "SCALAR", "name": "UInt64", - "description": - "String or Integer representation of a uint64 number. If the input is a string, it must represent the number in base 10", + "description": "String or Integer representation of a uint64 number. If the input is a string, it must represent the number in base 10", "fields": null, "inputFields": null, "interfaces": null, @@ -6368,10 +6455,13 @@ "fields": [ { "name": "nonce", - "description": - "Should only be set when cancelling transactions, otherwise a nonce is determined automatically", + "description": "Should only be set when cancelling transactions, otherwise a nonce is determined automatically", "args": [], - "type": { "kind": "SCALAR", "name": "UInt32", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "UInt32", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -6379,16 +6469,23 @@ "name": "memo", "description": "Short arbitrary message provided by the sender", "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "validUntil", - "description": - "The global slot since genesis after which this transaction cannot be applied", + "description": "The global slot since genesis after which this transaction cannot be applied", "args": [], - "type": { "kind": "SCALAR", "name": "UInt32", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "UInt32", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -6460,22 +6557,32 @@ "inputFields": [ { "name": "nonce", - "description": - "Should only be set when cancelling transactions, otherwise a nonce is determined automatically", - "type": { "kind": "SCALAR", "name": "UInt32", "ofType": null }, + "description": "Should only be set when cancelling transactions, otherwise a nonce is determined automatically", + "type": { + "kind": "SCALAR", + "name": "UInt32", + "ofType": null + }, "defaultValue": null }, { "name": "memo", "description": "Short arbitrary message provided by the sender", - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "defaultValue": null }, { "name": "validUntil", - "description": - "The global slot since genesis after which this transaction cannot be applied", - "type": { "kind": "SCALAR", "name": "UInt32", "ofType": null }, + "description": "The global slot since genesis after which this transaction cannot be applied", + "type": { + "kind": "SCALAR", + "name": "UInt32", + "ofType": null + }, "defaultValue": null }, { @@ -6551,15 +6658,18 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null }, { "name": "coinbase", - "description": - "The amount received as a coinbase reward for producing a block", + "description": "The amount received as a coinbase reward for producing a block", "args": [], "type": { "kind": "NON_NULL", @@ -6631,8 +6741,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "MerklePathElement", - "ofType": null + "name": "MerklePathElement" } } } @@ -6655,7 +6764,11 @@ "name": "token", "description": "Token id of the account", "args": [], - "type": { "kind": "SCALAR", "name": "TokenId", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "TokenId", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -6680,7 +6793,11 @@ { "name": "token", "description": "Token id of the account", - "type": { "kind": "SCALAR", "name": "TokenId", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "TokenId", + "ofType": null + }, "defaultValue": null }, { @@ -6770,8 +6887,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "MerklePathElement", - "ofType": null + "name": "MerklePathElement" } } } @@ -6788,8 +6904,7 @@ { "kind": "OBJECT", "name": "WorkBundleSpec", - "description": - "Witnesses and statements for snark work bundles. Includes optional fees and prover public keys for ones that have proofs in the snark pool", + "description": "Witnesses and statements for snark work bundles. Includes optional fees and prover public keys for ones that have proofs in the snark pool", "fields": [ { "name": "spec", @@ -6811,14 +6926,17 @@ "name": "snarkFee", "description": "Fee if proof for the spec exists in snark pool", "args": [], - "type": { "kind": "SCALAR", "name": "Fee", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "snarkProverKey", - "description": - "Prover public key if proof for the spec exists in snark pool", + "description": "Prover public key if proof for the spec exists in snark pool", "args": [], "type": { "kind": "SCALAR", @@ -6843,8 +6961,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "Int", - "ofType": null + "name": "Int" } } } @@ -6861,8 +6978,7 @@ { "kind": "OBJECT", "name": "PendingSnarkWorkSpec", - "description": - "Snark work witnesses and statements that are yet to be proven or included in blocks", + "description": "Snark work witnesses and statements that are yet to be proven or included in blocks", "fields": [ { "name": "workBundleSpec", @@ -6889,13 +7005,11 @@ { "kind": "OBJECT", "name": "WorkDescription", - "description": - "Transition from a source ledger to a target ledger with some fee excess and increase in supply ", + "description": "Transition from a source ledger to a target ledger with some fee excess and increase in supply ", "fields": [ { "name": "sourceFirstPassLedgerHash", - "description": - "Base58Check-encoded hash of the source first-pass ledger", + "description": "Base58Check-encoded hash of the source first-pass ledger", "args": [], "type": { "kind": "NON_NULL", @@ -6911,8 +7025,7 @@ }, { "name": "targetFirstPassLedgerHash", - "description": - "Base58Check-encoded hash of the target first-pass ledger", + "description": "Base58Check-encoded hash of the target first-pass ledger", "args": [], "type": { "kind": "NON_NULL", @@ -6928,8 +7041,7 @@ }, { "name": "sourceSecondPassLedgerHash", - "description": - "Base58Check-encoded hash of the source second-pass ledger", + "description": "Base58Check-encoded hash of the source second-pass ledger", "args": [], "type": { "kind": "NON_NULL", @@ -6945,8 +7057,7 @@ }, { "name": "targetSecondPassLedgerHash", - "description": - "Base58Check-encoded hash of the target second-pass ledger", + "description": "Base58Check-encoded hash of the target second-pass ledger", "args": [], "type": { "kind": "NON_NULL", @@ -6962,8 +7073,7 @@ }, { "name": "feeExcess", - "description": - "Total transaction fee that is not accounted for in the transition from source ledger to target ledger", + "description": "Total transaction fee that is not accounted for in the transition from source ledger to target ledger", "args": [], "type": { "kind": "NON_NULL", @@ -7016,7 +7126,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -7030,8 +7144,7 @@ { "kind": "OBJECT", "name": "PendingSnarkWork", - "description": - "Snark work bundles that are not available in the pool yet", + "description": "Snark work bundles that are not available in the pool yet", "fields": [ { "name": "workBundle", @@ -7048,8 +7161,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "WorkDescription", - "ofType": null + "name": "WorkDescription" } } } @@ -7130,7 +7242,11 @@ "name": "bannedStatus", "description": "Banned status", "args": [], - "type": { "kind": "SCALAR", "name": "Time", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Time", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null } @@ -7156,15 +7272,13 @@ }, { "name": "PENDING", - "description": - "A transaction either in the transition frontier or in transaction pool but is not on the longest chain", + "description": "A transaction either in the transition frontier or in transaction pool but is not on the longest chain", "isDeprecated": false, "deprecationReason": null }, { "name": "UNKNOWN", - "description": - "The transaction has either been snarked, reached finality through consensus or has been dropped", + "description": "The transaction has either been snarked, reached finality through consensus or has been dropped", "isDeprecated": false, "deprecationReason": null } @@ -7209,7 +7323,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -7229,8 +7347,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "Int", - "ofType": null + "name": "Int" } } } @@ -7277,21 +7394,23 @@ }, { "name": "fee", - "description": - "Amount that the recipient is paid in this fee transfer", + "description": "Amount that the recipient is paid in this fee transfer", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null }, { "name": "type", - "description": - "Fee_transfer|Fee_transfer_via_coinbase Snark worker fees deducted from the coinbase amount are of type 'Fee_transfer_via_coinbase', rest are deducted from transaction fees", + "description": "Fee_transfer|Fee_transfer_via_coinbase Snark worker fees deducted from the coinbase amount are of type 'Fee_transfer_via_coinbase', rest are deducted from transaction fees", "args": [], "type": { "kind": "NON_NULL", @@ -7330,14 +7449,17 @@ "name": "index", "description": "List index of the account update that failed", "args": [], - "type": { "kind": "SCALAR", "name": "Index", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Index", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "failures", - "description": - "Failure reason for the account update or any nested zkapp command", + "description": "Failure reason for the account update or any nested zkapp command", "args": [], "type": { "kind": "NON_NULL", @@ -7350,8 +7472,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "TransactionStatusFailure", - "ofType": null + "name": "TransactionStatusFailure" } } } @@ -7641,7 +7762,11 @@ "name": "receiptChainHash", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -7681,7 +7806,11 @@ "name": "actionState", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -7689,7 +7818,11 @@ "name": "provedState", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -7697,7 +7830,11 @@ "name": "isNew", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null } @@ -7716,7 +7853,11 @@ "name": "hash", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -7763,7 +7904,11 @@ "name": "seed", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -7771,7 +7916,11 @@ "name": "startCheckpoint", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -7779,7 +7928,11 @@ "name": "lockCheckpoint", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -7939,7 +8092,11 @@ "name": "snarkedLedgerHash", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Field", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Field", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -8585,7 +8742,11 @@ "name": "zkappUri", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -8593,7 +8754,11 @@ "name": "tokenSymbol", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -8601,7 +8766,11 @@ "name": "timing", "description": null, "args": [], - "type": { "kind": "OBJECT", "name": "Timing", "ofType": null }, + "type": { + "kind": "OBJECT", + "name": "Timing", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -8723,16 +8892,7 @@ "name": null, "ofType": { "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Field", - "ofType": null - } - } + "name": null } } } @@ -8755,16 +8915,7 @@ "name": null, "ofType": { "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Field", - "ofType": null - } - } + "name": null } } } @@ -8795,7 +8946,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -8977,7 +9132,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -9095,8 +9254,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "ZkappAccountUpdate", - "ofType": null + "name": "ZkappAccountUpdate" } } } @@ -9181,8 +9339,7 @@ }, { "name": "failureReason", - "description": - "The reason for the zkApp transaction failure; null means success or the status is unknown", + "description": "The reason for the zkApp transaction failure; null means success or the status is unknown", "args": [], "type": { "kind": "LIST", @@ -9257,13 +9414,16 @@ }, { "name": "nonce", - "description": - "Sequence number of command for the fee-payer's account", + "description": "Sequence number of command for the fee-payer's account", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -9318,8 +9478,7 @@ }, { "name": "validUntil", - "description": - "The global slot number after which this transaction cannot be applied", + "description": "The global slot number after which this transaction cannot be applied", "args": [], "type": { "kind": "NON_NULL", @@ -9351,8 +9510,7 @@ }, { "name": "amount", - "description": - "Amount that the source is sending to receiver; 0 for commands without an associated amount", + "description": "Amount that the source is sending to receiver; 0 for commands without an associated amount", "args": [], "type": { "kind": "NON_NULL", @@ -9384,21 +9542,23 @@ }, { "name": "fee", - "description": - "Fee that the fee-payer is willing to pay for making the transaction", + "description": "Fee that the fee-payer is willing to pay for making the transaction", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null }, { "name": "memo", - "description": - "A short message from the sender, encoded with Base58Check, version byte=0x14; byte 2 of the decoding is the message length", + "description": "A short message from the sender, encoded with Base58Check, version byte=0x14; byte 2 of the decoding is the message length", "args": [], "type": { "kind": "NON_NULL", @@ -9414,8 +9574,7 @@ }, { "name": "isDelegation", - "description": - "If true, this command represents a delegation of stake", + "description": "If true, this command represents a delegation of stake", "args": [], "type": { "kind": "NON_NULL", @@ -9495,8 +9654,7 @@ }, { "name": "failureReason", - "description": - "null is no failure or status unknown, reason for failure otherwise.", + "description": "null is no failure or status unknown, reason for failure otherwise.", "args": [], "type": { "kind": "SCALAR", @@ -9509,7 +9667,11 @@ ], "inputFields": null, "interfaces": [ - { "kind": "INTERFACE", "name": "UserCommand", "ofType": null } + { + "kind": "INTERFACE", + "name": "UserCommand", + "ofType": null + } ], "enumValues": null, "possibleTypes": null @@ -9641,13 +9803,16 @@ }, { "name": "nonce", - "description": - "Sequence number of command for the fee-payer's account", + "description": "Sequence number of command for the fee-payer's account", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -9702,8 +9867,7 @@ }, { "name": "validUntil", - "description": - "The global slot number after which this transaction cannot be applied", + "description": "The global slot number after which this transaction cannot be applied", "args": [], "type": { "kind": "NON_NULL", @@ -9735,8 +9899,7 @@ }, { "name": "amount", - "description": - "Amount that the source is sending to receiver; 0 for commands without an associated amount", + "description": "Amount that the source is sending to receiver; 0 for commands without an associated amount", "args": [], "type": { "kind": "NON_NULL", @@ -9768,21 +9931,23 @@ }, { "name": "fee", - "description": - "Fee that the fee-payer is willing to pay for making the transaction", + "description": "Fee that the fee-payer is willing to pay for making the transaction", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null }, { "name": "memo", - "description": - "A short message from the sender, encoded with Base58Check, version byte=0x14; byte 2 of the decoding is the message length", + "description": "A short message from the sender, encoded with Base58Check, version byte=0x14; byte 2 of the decoding is the message length", "args": [], "type": { "kind": "NON_NULL", @@ -9798,8 +9963,7 @@ }, { "name": "isDelegation", - "description": - "If true, this command represents a delegation of stake", + "description": "If true, this command represents a delegation of stake", "args": [], "type": { "kind": "NON_NULL", @@ -9879,8 +10043,7 @@ }, { "name": "failureReason", - "description": - "null is no failure or status unknown, reason for failure otherwise.", + "description": "null is no failure or status unknown, reason for failure otherwise.", "args": [], "type": { "kind": "SCALAR", @@ -9893,7 +10056,11 @@ ], "inputFields": null, "interfaces": [ - { "kind": "INTERFACE", "name": "UserCommand", "ofType": null } + { + "kind": "INTERFACE", + "name": "UserCommand", + "ofType": null + } ], "enumValues": null, "possibleTypes": null @@ -9953,13 +10120,16 @@ }, { "name": "nonce", - "description": - "Sequence number of command for the fee-payer's account", + "description": "Sequence number of command for the fee-payer's account", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -10014,8 +10184,7 @@ }, { "name": "validUntil", - "description": - "The global slot number after which this transaction cannot be applied", + "description": "The global slot number after which this transaction cannot be applied", "args": [], "type": { "kind": "NON_NULL", @@ -10047,8 +10216,7 @@ }, { "name": "amount", - "description": - "Amount that the source is sending to receiver - 0 for commands that are not associated with an amount", + "description": "Amount that the source is sending to receiver - 0 for commands that are not associated with an amount", "args": [], "type": { "kind": "NON_NULL", @@ -10080,13 +10248,16 @@ }, { "name": "fee", - "description": - "Fee that the fee-payer is willing to pay for making the transaction", + "description": "Fee that the fee-payer is willing to pay for making the transaction", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -10109,8 +10280,7 @@ }, { "name": "isDelegation", - "description": - "If true, this represents a delegation of stake, otherwise it is a payment", + "description": "If true, this represents a delegation of stake, otherwise it is a payment", "args": [], "type": { "kind": "NON_NULL", @@ -10190,8 +10360,7 @@ }, { "name": "failureReason", - "description": - "null is no failure, reason for failure otherwise.", + "description": "null is no failure, reason for failure otherwise.", "args": [], "type": { "kind": "SCALAR", @@ -10208,13 +10377,11 @@ "possibleTypes": [ { "kind": "OBJECT", - "name": "UserCommandDelegation", - "ofType": null + "name": "UserCommandDelegation" }, { "kind": "OBJECT", - "name": "UserCommandPayment", - "ofType": null + "name": "UserCommandPayment" } ] }, @@ -10225,8 +10392,7 @@ "fields": [ { "name": "userCommands", - "description": - "List of user commands (payments and stake delegations) included in this block", + "description": "List of user commands (payments and stake delegations) included in this block", "args": [], "type": { "kind": "NON_NULL", @@ -10239,8 +10405,7 @@ "name": null, "ofType": { "kind": "INTERFACE", - "name": "UserCommand", - "ofType": null + "name": "UserCommand" } } } @@ -10263,8 +10428,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "ZkappCommandResult", - "ofType": null + "name": "ZkappCommandResult" } } } @@ -10287,8 +10451,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "FeeTransfer", - "ofType": null + "name": "FeeTransfer" } } } @@ -10298,8 +10461,7 @@ }, { "name": "coinbase", - "description": - "Amount of MINA granted to the producer of this block", + "description": "Amount of MINA granted to the producer of this block", "args": [], "type": { "kind": "NON_NULL", @@ -10315,10 +10477,13 @@ }, { "name": "coinbaseReceiverAccount", - "description": - "Account to which the coinbase for this block was granted", + "description": "Account to which the coinbase for this block was granted", "args": [], - "type": { "kind": "OBJECT", "name": "Account", "ofType": null }, + "type": { + "kind": "OBJECT", + "name": "Account", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null } @@ -10369,7 +10534,11 @@ "name": "json", "description": "JSON-encoded proof", "args": [], - "type": { "kind": "SCALAR", "name": "JSON", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "JSON", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null } @@ -10833,8 +11002,7 @@ }, { "name": "superchargedCoinbase", - "description": - "Whether or not this coinbase was \"supercharged\", ie. created by an account that has no locked tokens", + "description": "Whether or not this coinbase was \"supercharged\", ie. created by an account that has no locked tokens", "args": [], "type": { "kind": "NON_NULL", @@ -10850,8 +11018,7 @@ }, { "name": "blockStakeWinner", - "description": - "The public key that is responsible for winning this block (including delegations)", + "description": "The public key that is responsible for winning this block (including delegations)", "args": [], "type": { "kind": "NON_NULL", @@ -10867,8 +11034,7 @@ }, { "name": "blockCreator", - "description": - "The block producer public key that created this block", + "description": "The block producer public key that created this block", "args": [], "type": { "kind": "NON_NULL", @@ -10907,8 +11073,7 @@ { "kind": "SCALAR", "name": "BodyReference", - "description": - "A reference to how the block header refers to the body of the block as a hex-encoded string", + "description": "A reference to how the block header refers to the body of the block as a hex-encoded string", "fields": null, "inputFields": null, "interfaces": null, @@ -10927,7 +11092,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "ENUM", "name": "sign", "ofType": null } + "ofType": { + "kind": "ENUM", + "name": "sign", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -10939,7 +11108,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -11060,7 +11233,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "ENUM", "name": "sign", "ofType": null } + "ofType": { + "kind": "ENUM", + "name": "sign", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -11126,8 +11303,7 @@ }, { "name": "transactionCommitment", - "description": - "Transaction commitment component of local state", + "description": "Transaction commitment component of local state", "args": [], "type": { "kind": "NON_NULL", @@ -11143,8 +11319,7 @@ }, { "name": "fullTransactionCommitment", - "description": - "Full transaction commitment component of local state", + "description": "Full transaction commitment component of local state", "args": [], "type": { "kind": "NON_NULL", @@ -11253,16 +11428,7 @@ "name": null, "ofType": { "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null - } - } + "name": null } } } @@ -11558,7 +11724,11 @@ "name": "sokDigest", "description": "Placeholder for SOK digest", "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null } @@ -11571,8 +11741,7 @@ { "kind": "SCALAR", "name": "PendingCoinbaseHash", - "description": - "Base58Check-encoded hash of a pending coinbase hash", + "description": "Base58Check-encoded hash of a pending coinbase hash", "fields": null, "inputFields": null, "interfaces": null, @@ -11582,8 +11751,7 @@ { "kind": "SCALAR", "name": "PendingCoinbaseAuxHash", - "description": - "Base58Check-encoded hash of a pending coinbase auxiliary hash", + "description": "Base58Check-encoded hash of a pending coinbase auxiliary hash", "fields": null, "inputFields": null, "interfaces": null, @@ -11593,8 +11761,7 @@ { "kind": "SCALAR", "name": "StagedLedgerAuxHash", - "description": - "Base58Check-encoded hash of the staged ledger hash's aux_hash", + "description": "Base58Check-encoded hash of the staged ledger hash's aux_hash", "fields": null, "inputFields": null, "interfaces": null, @@ -11618,8 +11785,7 @@ "fields": [ { "name": "date", - "description": - "date (stringified Unix time - number of milliseconds since January 1, 1970)", + "description": "date (stringified Unix time - number of milliseconds since January 1, 1970)", "args": [], "type": { "kind": "NON_NULL", @@ -11635,8 +11801,7 @@ }, { "name": "utcDate", - "description": - "utcDate (stringified Unix time - number of milliseconds since January 1, 1970). Time offsets are adjusted to reflect true wall-clock time instead of genesis time.", + "description": "utcDate (stringified Unix time - number of milliseconds since January 1, 1970). Time offsets are adjusted to reflect true wall-clock time instead of genesis time.", "args": [], "type": { "kind": "NON_NULL", @@ -11668,8 +11833,7 @@ }, { "name": "stagedLedgerHash", - "description": - "Base58Check-encoded hash of the staged ledger hash's main ledger hash", + "description": "Base58Check-encoded hash of the staged ledger hash's main ledger hash", "args": [], "type": { "kind": "NON_NULL", @@ -11685,8 +11849,7 @@ }, { "name": "stagedLedgerAuxHash", - "description": - "Base58Check-encoded hash of the staged ledger hash's aux_hash", + "description": "Base58Check-encoded hash of the staged ledger hash's aux_hash", "args": [], "type": { "kind": "NON_NULL", @@ -11702,8 +11865,7 @@ }, { "name": "stagedLedgerPendingCoinbaseAux", - "description": - "Base58Check-encoded staged ledger hash's pending_coinbase_aux", + "description": "Base58Check-encoded staged ledger hash's pending_coinbase_aux", "args": [], "type": { "kind": "NON_NULL", @@ -11719,8 +11881,7 @@ }, { "name": "stagedLedgerPendingCoinbaseHash", - "description": - "Base58Check-encoded hash of the staged ledger hash's pending_coinbase_hash", + "description": "Base58Check-encoded hash of the staged ledger hash's pending_coinbase_hash", "args": [], "type": { "kind": "NON_NULL", @@ -11736,10 +11897,13 @@ }, { "name": "stagedLedgerProofEmitted", - "description": - "Block finished a staged ledger, and a proof was emitted from it and included into this block's proof. If there is no transition frontier available or no block found, this will return null.", + "description": "Block finished a staged ledger, and a proof was emitted from it and included into this block's proof. If there is no transition frontier available or no block found, this will return null.", "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -11761,8 +11925,7 @@ }, { "name": "bodyReference", - "description": - "A reference to how the block header refers to the body of the block as a hex-encoded string", + "description": "A reference to how the block header refers to the body of the block as a hex-encoded string", "args": [], "type": { "kind": "NON_NULL", @@ -11805,8 +11968,7 @@ }, { "name": "blockchainState", - "description": - "State which is agnostic of a particular consensus algorithm", + "description": "State which is agnostic of a particular consensus algorithm", "args": [], "type": { "kind": "NON_NULL", @@ -11822,8 +11984,7 @@ }, { "name": "consensusState", - "description": - "State specific to the minaboros Proof of Stake consensus algorithm", + "description": "State specific to the minaboros Proof of Stake consensus algorithm", "args": [], "type": { "kind": "NON_NULL", @@ -11846,8 +12007,7 @@ { "kind": "SCALAR", "name": "StateHashAsDecimal", - "description": - "Experimental: Bigint field-element representation of stateHash", + "description": "Experimental: Bigint field-element representation of stateHash", "fields": null, "inputFields": null, "interfaces": null, @@ -11909,8 +12069,7 @@ }, { "name": "stateHash", - "description": - "Base58Check-encoded hash of the state after this block", + "description": "Base58Check-encoded hash of the state after this block", "args": [], "type": { "kind": "NON_NULL", @@ -11926,8 +12085,7 @@ }, { "name": "stateHashField", - "description": - "Experimental: Bigint field-element representation of stateHash", + "description": "Experimental: Bigint field-element representation of stateHash", "args": [], "type": { "kind": "NON_NULL", @@ -11991,13 +12149,16 @@ }, { "name": "commandTransactionCount", - "description": - "Count of user command transactions in the block", + "description": "Count of user command transactions in the block", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -12017,8 +12178,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "CompletedWork", - "ofType": null + "name": "CompletedWork" } } } @@ -12081,13 +12241,16 @@ }, { "name": "fee", - "description": - "Fee that snark worker is charging to generate a snark proof", + "description": "Fee that snark worker is charging to generate a snark proof", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Fee", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Fee", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -12152,7 +12315,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -12183,8 +12350,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "NetworkPeerPayload", - "ofType": null + "name": "NetworkPeerPayload" } } } @@ -12194,8 +12360,7 @@ }, { "name": "bannedPeers", - "description": - "Peers we will never allow connections from (unless they are also trusted!)", + "description": "Peers we will never allow connections from (unless they are also trusted!)", "args": [], "type": { "kind": "NON_NULL", @@ -12208,8 +12373,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "NetworkPeerPayload", - "ofType": null + "name": "NetworkPeerPayload" } } } @@ -12219,8 +12383,7 @@ }, { "name": "isolate", - "description": - "If true, no connections will be allowed unless they are from a trusted peer", + "description": "If true, no connections will be allowed unless they are from a trusted peer", "args": [], "type": { "kind": "NON_NULL", @@ -12355,8 +12518,7 @@ "fields": [ { "name": "auth", - "description": - "Authorization required to set the verification key of the zkApp associated with the account", + "description": "Authorization required to set the verification key of the zkApp associated with the account", "args": [], "type": { "kind": "NON_NULL", @@ -12536,8 +12698,7 @@ }, { "name": "setVerificationKey", - "description": - "Authorization required to set the verification key of the zkApp associated with the account", + "description": "Authorization required to set the verification key of the zkApp associated with the account", "args": [], "type": { "kind": "NON_NULL", @@ -12553,8 +12714,7 @@ }, { "name": "setZkappUri", - "description": - "Authorization required to change the URI of the zkApp associated with the account ", + "description": "Authorization required to change the URI of the zkApp associated with the account ", "args": [], "type": { "kind": "NON_NULL", @@ -12570,8 +12730,7 @@ }, { "name": "editActionState", - "description": - "Authorization required to edit the action state", + "description": "Authorization required to edit the action state", "args": [], "type": { "kind": "NON_NULL", @@ -12619,8 +12778,7 @@ }, { "name": "setVotingFor", - "description": - "Authorization required to set the state hash the account is voting for", + "description": "Authorization required to set the state hash the account is voting for", "args": [], "type": { "kind": "NON_NULL", @@ -12636,8 +12794,7 @@ }, { "name": "setTiming", - "description": - "Authorization required to set the timing of the account", + "description": "Authorization required to set the timing of the account", "args": [], "type": { "kind": "NON_NULL", @@ -12710,8 +12867,7 @@ { "kind": "OBJECT", "name": "AnnotatedBalance", - "description": - "A total balance annotated with the amount that is currently unknown with the invariant unknown <= total, as well as the currently liquid and locked balances.", + "description": "A total balance annotated with the amount that is currently unknown with the invariant unknown <= total, as well as the currently liquid and locked balances.", "fields": [ { "name": "total", @@ -12731,8 +12887,7 @@ }, { "name": "unknown", - "description": - "The amount of MINA owned by the account whose origin is currently unknown", + "description": "The amount of MINA owned by the account whose origin is currently unknown", "args": [], "type": { "kind": "NON_NULL", @@ -12748,19 +12903,25 @@ }, { "name": "liquid", - "description": - "The amount of MINA owned by the account which is currently available. Can be null if bootstrapping.", + "description": "The amount of MINA owned by the account which is currently available. Can be null if bootstrapping.", "args": [], - "type": { "kind": "SCALAR", "name": "Balance", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Balance", + "ofType": null + }, "isDeprecated": true, "deprecationReason": null }, { "name": "locked", - "description": - "The amount of MINA owned by the account which is currently locked. Can be null if bootstrapping.", + "description": "The amount of MINA owned by the account which is currently locked. Can be null if bootstrapping.", "args": [], - "type": { "kind": "SCALAR", "name": "Balance", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Balance", + "ofType": null + }, "isDeprecated": true, "deprecationReason": null }, @@ -12782,8 +12943,7 @@ }, { "name": "stateHash", - "description": - "Hash of block at which balance was measured. Can be null if bootstrapping. Guaranteed to be non-null for direct account lookup queries when not bootstrapping. Can also be null when accessed as nested properties (eg. via delegators). ", + "description": "Hash of block at which balance was measured. Can be null if bootstrapping. Guaranteed to be non-null for direct account lookup queries when not bootstrapping. Can also be null when accessed as nested properties (eg. via delegators). ", "args": [], "type": { "kind": "SCALAR", @@ -12836,10 +12996,13 @@ "fields": [ { "name": "initialMinimumBalance", - "description": - "The initial minimum balance for a time-locked account", + "description": "The initial minimum balance for a time-locked account", "args": [], - "type": { "kind": "SCALAR", "name": "Balance", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Balance", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -12859,7 +13022,11 @@ "name": "cliffAmount", "description": "The cliff amount for a time-locked account", "args": [], - "type": { "kind": "SCALAR", "name": "Amount", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Amount", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -12877,10 +13044,13 @@ }, { "name": "vestingIncrement", - "description": - "The vesting increment for a time-locked account", + "description": "The vesting increment for a time-locked account", "args": [], - "type": { "kind": "SCALAR", "name": "Amount", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Amount", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null } @@ -12893,8 +13063,7 @@ { "kind": "SCALAR", "name": "TokenId", - "description": - "String representation of a token's UInt64 identifier", + "description": "String representation of a token's UInt64 identifier", "fields": null, "inputFields": null, "interfaces": null, @@ -12998,8 +13167,7 @@ }, { "name": "nonce", - "description": - "A natural number that increases with each transaction (stringified uint32)", + "description": "A natural number that increases with each transaction (stringified uint32)", "args": [], "type": { "kind": "SCALAR", @@ -13011,8 +13179,7 @@ }, { "name": "inferredNonce", - "description": - "Like the `nonce` field, except it includes the scheduled transactions (transactions not yet included in a block) (stringified uint32)", + "description": "Like the `nonce` field, except it includes the scheduled transactions (transactions not yet included in a block) (stringified uint32)", "args": [], "type": { "kind": "SCALAR", @@ -13024,10 +13191,13 @@ }, { "name": "epochDelegateAccount", - "description": - "The account that you delegated on the staking ledger of the current block's epoch", + "description": "The account that you delegated on the staking ledger of the current block's epoch", "args": [], - "type": { "kind": "OBJECT", "name": "Account", "ofType": null }, + "type": { + "kind": "OBJECT", + "name": "Account", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -13045,8 +13215,7 @@ }, { "name": "delegate", - "description": - "The public key to which you are delegating - if you are not delegating to anybody, this would return your public key", + "description": "The public key to which you are delegating - if you are not delegating to anybody, this would return your public key", "args": [], "type": { "kind": "SCALAR", @@ -13058,17 +13227,19 @@ }, { "name": "delegateAccount", - "description": - "The account to which you are delegating - if you are not delegating to anybody, this would return your public key", + "description": "The account to which you are delegating - if you are not delegating to anybody, this would return your public key", "args": [], - "type": { "kind": "OBJECT", "name": "Account", "ofType": null }, + "type": { + "kind": "OBJECT", + "name": "Account", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "delegators", - "description": - "The list of accounts which are delegating to you (note that the info is recorded in the last epoch so it might not be up to date with the current account status)", + "description": "The list of accounts which are delegating to you (note that the info is recorded in the last epoch so it might not be up to date with the current account status)", "args": [], "type": { "kind": "LIST", @@ -13088,8 +13259,7 @@ }, { "name": "lastEpochDelegators", - "description": - "The list of accounts which are delegating to you in the last epoch (note that the info is recorded in the one before last epoch so it might not be up to date with the current account status)", + "description": "The list of accounts which are delegating to you in the last epoch (note that the info is recorded in the one before last epoch so it might not be up to date with the current account status)", "args": [], "type": { "kind": "LIST", @@ -13109,8 +13279,7 @@ }, { "name": "votingFor", - "description": - "The previous epoch lock hash of the chain which you are voting for", + "description": "The previous epoch lock hash of the chain which you are voting for", "args": [], "type": { "kind": "SCALAR", @@ -13122,8 +13291,7 @@ }, { "name": "stakingActive", - "description": - "True if you are actively staking with this account on the current daemon - this may not yet have been updated if the staking key was changed recently", + "description": "True if you are actively staking with this account on the current daemon - this may not yet have been updated if the staking key was changed recently", "args": [], "type": { "kind": "NON_NULL", @@ -13155,35 +13323,43 @@ }, { "name": "locked", - "description": - "True if locked, false if unlocked, null if the account isn't tracked by the queried daemon", + "description": "True if locked, false if unlocked, null if the account isn't tracked by the queried daemon", "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "index", - "description": - "The index of this account in the ledger, or null if this account does not yet have a known position in the best tip ledger", + "description": "The index of this account in the ledger, or null if this account does not yet have a known position in the best tip ledger", "args": [], - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "zkappUri", - "description": - "The URI associated with this account, usually pointing to the zkApp source code", + "description": "The URI associated with this account, usually pointing to the zkApp source code", "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "zkappState", - "description": - "The 8 field elements comprising the zkApp state associated with this account encoded as bignum strings", + "description": "The 8 field elements comprising the zkApp state associated with this account encoded as bignum strings", "args": [], "type": { "kind": "LIST", @@ -13203,17 +13379,19 @@ }, { "name": "provedState", - "description": - "Boolean indicating whether all 8 fields on zkAppState were last set by a proof-authorized account update", + "description": "Boolean indicating whether all 8 fields on zkAppState were last set by a proof-authorized account update", "args": [], - "type": { "kind": "SCALAR", "name": "Boolean", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "permissions", - "description": - "Permissions for updating certain fields of this account", + "description": "Permissions for updating certain fields of this account", "args": [], "type": { "kind": "OBJECT", @@ -13225,10 +13403,13 @@ }, { "name": "tokenSymbol", - "description": - "The symbol for the token owned by this account, if there is one", + "description": "The symbol for the token owned by this account, if there is one", "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -13266,8 +13447,7 @@ }, { "name": "leafHash", - "description": - "The base58Check-encoded hash of this account to bootstrap the merklePath", + "description": "The base58Check-encoded hash of this account to bootstrap the merklePath", "args": [], "type": { "kind": "SCALAR", @@ -13279,8 +13459,7 @@ }, { "name": "merklePath", - "description": - "Merkle path is a list of path elements that are either the left or right hashes up to the root", + "description": "Merkle path is a list of path elements that are either the left or right hashes up to the root", "args": [], "type": { "kind": "LIST", @@ -13334,8 +13513,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "String", - "ofType": null + "name": "String" } } } @@ -13345,8 +13523,7 @@ }, { "name": "isCapturing", - "description": - "Whether we are capturing structured log messages", + "description": "Whether we are capturing structured log messages", "args": [], "type": { "kind": "NON_NULL", @@ -13386,8 +13563,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "Int", - "ofType": null + "name": "Int" } } } @@ -13402,7 +13578,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13414,7 +13594,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13426,7 +13610,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13438,7 +13626,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13450,7 +13642,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13462,7 +13658,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13474,7 +13674,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13486,7 +13690,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13538,7 +13746,11 @@ "name": "peer", "description": null, "args": [], - "type": { "kind": "OBJECT", "name": "Peer", "ofType": null }, + "type": { + "kind": "OBJECT", + "name": "Peer", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -13549,7 +13761,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13561,7 +13777,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13594,7 +13814,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13606,7 +13830,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13618,7 +13846,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13630,7 +13862,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13642,7 +13878,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13670,7 +13910,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -13684,13 +13928,11 @@ { "kind": "OBJECT", "name": "ConsensusTimeGlobalSlot", - "description": - "Consensus time and the corresponding global slot since genesis", + "description": "Consensus time and the corresponding global slot since genesis", "fields": [ { "name": "consensusTime", - "description": - "Time in terms of slot number in an epoch, start and end time of the slot since UTC epoch", + "description": "Time in terms of slot number in an epoch, start and end time of the slot since UTC epoch", "args": [], "type": { "kind": "NON_NULL", @@ -13756,8 +13998,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "ConsensusTime", - "ofType": null + "name": "ConsensusTime" } } } @@ -13767,8 +14008,7 @@ }, { "name": "globalSlotSinceGenesis", - "description": - "Next block production global-slot-since-genesis ", + "description": "Next block production global-slot-since-genesis ", "args": [], "type": { "kind": "NON_NULL", @@ -13781,8 +14021,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "Globalslot", - "ofType": null + "name": "Globalslot" } } } @@ -13792,8 +14031,7 @@ }, { "name": "generatedFromConsensusAt", - "description": - "Consensus time of the block that was used to determine the next block production time", + "description": "Consensus time of the block that was used to determine the next block production time", "args": [], "type": { "kind": "NON_NULL", @@ -14007,8 +14245,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "Int", - "ofType": null + "name": "Int" } } } @@ -14031,8 +14268,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Interval", - "ofType": null + "name": "Interval" } } } @@ -14047,7 +14283,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -14059,7 +14299,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -14323,7 +14567,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -14379,7 +14627,11 @@ "name": "numAccounts", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -14387,7 +14639,11 @@ "name": "blockchainLength", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -14398,7 +14654,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -14410,7 +14670,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -14422,7 +14686,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -14431,7 +14699,11 @@ "name": "ledgerMerkleRoot", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -14439,7 +14711,11 @@ "name": "stateHash", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -14506,8 +14782,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Peer", - "ofType": null + "name": "Peer" } } } @@ -14522,7 +14797,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -14531,7 +14810,11 @@ "name": "snarkWorker", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -14542,7 +14825,11 @@ "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -14598,8 +14885,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "String", - "ofType": null + "name": "String" } } } @@ -14611,7 +14897,11 @@ "name": "coinbaseReceiver", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -14643,7 +14933,11 @@ "name": "globalSlotSinceGenesisBestTip", "description": null, "args": [], - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -14833,14 +15127,17 @@ "name": "version", "description": "The version of the node (git commit hash)", "args": [], - "type": { "kind": "SCALAR", "name": "String", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, { "name": "getFilteredLogEntries", - "description": - "TESTING ONLY: Retrieve all new structured events in memory", + "description": "TESTING ONLY: Retrieve all new structured events in memory", "args": [ { "name": "offset", @@ -14871,8 +15168,7 @@ }, { "name": "ownedWallets", - "description": - "Wallets for which the daemon knows the private key", + "description": "Wallets for which the daemon knows the private key", "args": [], "type": { "kind": "NON_NULL", @@ -14885,8 +15181,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Account", - "ofType": null + "name": "Account" } } } @@ -14896,8 +15191,7 @@ }, { "name": "trackedAccounts", - "description": - "Accounts for which the daemon tracks the private key", + "description": "Accounts for which the daemon tracks the private key", "args": [], "type": { "kind": "NON_NULL", @@ -14910,8 +15204,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Account", - "ofType": null + "name": "Account" } } } @@ -14938,14 +15231,17 @@ "defaultValue": null } ], - "type": { "kind": "OBJECT", "name": "Account", "ofType": null }, + "type": { + "kind": "OBJECT", + "name": "Account", + "ofType": null + }, "isDeprecated": true, "deprecationReason": "use account instead" }, { "name": "connectionGatingConfig", - "description": - "The rules that the libp2p helper will use to determine which connections to permit", + "description": "The rules that the libp2p helper will use to determine which connections to permit", "args": [], "type": { "kind": "NON_NULL", @@ -14965,8 +15261,7 @@ "args": [ { "name": "token", - "description": - "Token of account being retrieved (defaults to MINA)", + "description": "Token of account being retrieved (defaults to MINA)", "type": { "kind": "SCALAR", "name": "TokenId", @@ -14989,7 +15284,11 @@ "defaultValue": null } ], - "type": { "kind": "OBJECT", "name": "Account", "ofType": null }, + "type": { + "kind": "OBJECT", + "name": "Account", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -15023,8 +15322,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Account", - "ofType": null + "name": "Account" } } } @@ -15051,7 +15349,11 @@ "defaultValue": null } ], - "type": { "kind": "OBJECT", "name": "Account", "ofType": null }, + "type": { + "kind": "OBJECT", + "name": "Account", + "ofType": null + }, "isDeprecated": false, "deprecationReason": null }, @@ -15085,8 +15387,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Account", - "ofType": null + "name": "Account" } } } @@ -15108,14 +15409,16 @@ }, { "name": "bestChain", - "description": - "Retrieve a list of blocks from transition frontier's root to the current best tip. Returns an error if the system is bootstrapping.", + "description": "Retrieve a list of blocks from transition frontier's root to the current best tip. Returns an error if the system is bootstrapping.", "args": [ { "name": "maxLength", - "description": - "The maximum number of blocks to return. If there are more blocks in the transition frontier from root to tip, the maxLength blocks closest to the best tip will be returned", - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, + "description": "The maximum number of blocks to return. If there are more blocks in the transition frontier from root to tip, the maxLength blocks closest to the best tip will be returned", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, "defaultValue": null } ], @@ -15137,14 +15440,16 @@ }, { "name": "block", - "description": - "Retrieve a block with the given state hash or height, if contained in the transition frontier.", + "description": "Retrieve a block with the given state hash or height, if contained in the transition frontier.", "args": [ { "name": "height", - "description": - "The height of the desired block in the best chain", - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, + "description": "The height of the desired block in the best chain", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, "defaultValue": null }, { @@ -15188,8 +15493,7 @@ }, { "name": "initialPeers", - "description": - "List of peers that the daemon first used to connect to the network", + "description": "List of peers that the daemon first used to connect to the network", "args": [], "type": { "kind": "NON_NULL", @@ -15202,8 +15506,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "String", - "ofType": null + "name": "String" } } } @@ -15213,8 +15516,7 @@ }, { "name": "getPeers", - "description": - "List of peers that the daemon is currently connected to", + "description": "List of peers that the daemon is currently connected to", "args": [], "type": { "kind": "NON_NULL", @@ -15227,8 +15529,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "Peer", - "ofType": null + "name": "Peer" } } } @@ -15238,8 +15539,7 @@ }, { "name": "pooledUserCommands", - "description": - "Retrieve all the scheduled user commands for a specified sender that the current daemon sees in its transaction pool. All scheduled commands are queried if no sender is specified", + "description": "Retrieve all the scheduled user commands for a specified sender that the current daemon sees in its transaction pool. All scheduled commands are queried if no sender is specified", "args": [ { "name": "ids", @@ -15279,8 +15579,7 @@ }, { "name": "publicKey", - "description": - "Public key of sender of pooled user commands", + "description": "Public key of sender of pooled user commands", "type": { "kind": "SCALAR", "name": "PublicKey", @@ -15300,8 +15599,7 @@ "name": null, "ofType": { "kind": "INTERFACE", - "name": "UserCommand", - "ofType": null + "name": "UserCommand" } } } @@ -15311,8 +15609,7 @@ }, { "name": "pooledZkappCommands", - "description": - "Retrieve all the scheduled zkApp commands for a specified sender that the current daemon sees in its transaction pool. All scheduled commands are queried if no sender is specified", + "description": "Retrieve all the scheduled zkApp commands for a specified sender that the current daemon sees in its transaction pool. All scheduled commands are queried if no sender is specified", "args": [ { "name": "ids", @@ -15334,8 +15631,7 @@ }, { "name": "hashes", - "description": - "Hashes of the zkApp commands to find in the pool", + "description": "Hashes of the zkApp commands to find in the pool", "type": { "kind": "LIST", "name": null, @@ -15353,8 +15649,7 @@ }, { "name": "publicKey", - "description": - "Public key of sender of pooled zkApp commands", + "description": "Public key of sender of pooled zkApp commands", "type": { "kind": "SCALAR", "name": "PublicKey", @@ -15374,8 +15669,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "ZkappCommandResult", - "ofType": null + "name": "ZkappCommandResult" } } } @@ -15390,13 +15684,21 @@ { "name": "zkappTransaction", "description": "Id of a zkApp transaction", - "type": { "kind": "SCALAR", "name": "ID", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + }, "defaultValue": null }, { "name": "payment", "description": "Id of a Payment", - "type": { "kind": "SCALAR", "name": "ID", "ofType": null }, + "type": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + }, "defaultValue": null } ], @@ -15462,8 +15764,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "TrustStatusPayload", - "ofType": null + "name": "TrustStatusPayload" } } } @@ -15473,8 +15774,7 @@ }, { "name": "snarkPool", - "description": - "List of completed snark works that have the lowest fee so far", + "description": "List of completed snark works that have the lowest fee so far", "args": [], "type": { "kind": "NON_NULL", @@ -15487,8 +15787,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "CompletedWork", - "ofType": null + "name": "CompletedWork" } } } @@ -15511,8 +15810,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "PendingSnarkWork", - "ofType": null + "name": "PendingSnarkWork" } } } @@ -15522,13 +15820,11 @@ }, { "name": "snarkWorkRange", - "description": - "Find any sequence of snark work between two indexes in all available snark work. Returns both completed and uncompleted work.", + "description": "Find any sequence of snark work between two indexes in all available snark work. Returns both completed and uncompleted work.", "args": [ { "name": "endingIndex", - "description": - "The last index to be taken from all available snark work (exclusive). If not specified or greater than the available snark work list,all elements from index [startingIndex] will be returned. An empty list will be returned if startingIndex is not a valid index or if startingIndex >= endingIndex.", + "description": "The last index to be taken from all available snark work (exclusive). If not specified or greater than the available snark work list,all elements from index [startingIndex] will be returned. An empty list will be returned if startingIndex is not a valid index or if startingIndex >= endingIndex.", "type": { "kind": "SCALAR", "name": "UInt32", @@ -15538,8 +15834,7 @@ }, { "name": "startingIndex", - "description": - "The first index to be taken from all available snark work", + "description": "The first index to be taken from all available snark work", "type": { "kind": "NON_NULL", "name": null, @@ -15563,8 +15858,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "PendingSnarkWorkSpec", - "ofType": null + "name": "PendingSnarkWorkSpec" } } } @@ -15574,8 +15868,7 @@ }, { "name": "snarkedLedgerAccountMembership", - "description": - "obtain a membership proof for an account in the snarked ledger along with the account's balance, timing information, and nonce", + "description": "obtain a membership proof for an account in the snarked ledger along with the account's balance, timing information, and nonce", "args": [ { "name": "stateHash", @@ -15605,8 +15898,7 @@ "name": null, "ofType": { "kind": "INPUT_OBJECT", - "name": "AccountInput", - "ofType": null + "name": "AccountInput" } } } @@ -15625,8 +15917,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "MembershipInfo", - "ofType": null + "name": "MembershipInfo" } } } @@ -15636,8 +15927,7 @@ }, { "name": "encodedSnarkedLedgerAccountMembership", - "description": - "obtain a membership proof for an account in the snarked ledger along with the accounts full information encoded as base64 binable type", + "description": "obtain a membership proof for an account in the snarked ledger along with the accounts full information encoded as base64 binable type", "args": [ { "name": "stateHash", @@ -15667,8 +15957,7 @@ "name": null, "ofType": { "kind": "INPUT_OBJECT", - "name": "AccountInput", - "ofType": null + "name": "AccountInput" } } } @@ -15687,8 +15976,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "EncodedAccount", - "ofType": null + "name": "EncodedAccount" } } } @@ -15698,8 +15986,7 @@ }, { "name": "genesisConstants", - "description": - "The constants used to determine the configuration of the genesis block and all of its transitive dependencies", + "description": "The constants used to determine the configuration of the genesis block and all of its transitive dependencies", "args": [], "type": { "kind": "NON_NULL", @@ -15715,13 +16002,16 @@ }, { "name": "timeOffset", - "description": - "The time offset in seconds used to convert real times into blockchain times", + "description": "The time offset in seconds used to convert real times into blockchain times", "args": [], "type": { "kind": "NON_NULL", "name": null, - "ofType": { "kind": "SCALAR", "name": "Int", "ofType": null } + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -15732,8 +16022,7 @@ "args": [ { "name": "signature", - "description": - "If a signature is provided, this transaction is considered signed and will be broadcasted to the network without requiring a private key", + "description": "If a signature is provided, this transaction is considered signed and will be broadcasted to the network without requiring a private key", "type": { "kind": "INPUT_OBJECT", "name": "SignatureInput", @@ -15770,8 +16059,7 @@ }, { "name": "evaluateVrf", - "description": - "Evaluate a vrf for the given public key. This includes a witness which may be verified without access to the private key for this vrf evaluation.", + "description": "Evaluate a vrf for the given public key. This includes a witness which may be verified without access to the private key for this vrf evaluation.", "args": [ { "name": "vrfThreshold", @@ -15826,8 +16114,7 @@ }, { "name": "checkVrf", - "description": - "Check a vrf evaluation commitment. This can be used to check vrf evaluations without needing to reveal the private key, in the format returned by evaluateVrf", + "description": "Check a vrf evaluation commitment. This can be used to check vrf evaluations without needing to reveal the private key, in the format returned by evaluateVrf", "args": [ { "name": "input", @@ -15858,8 +16145,7 @@ }, { "name": "runtimeConfig", - "description": - "The runtime configuration passed to the daemon at start-up", + "description": "The runtime configuration passed to the daemon at start-up", "args": [], "type": { "kind": "NON_NULL", @@ -15875,14 +16161,16 @@ }, { "name": "fork_config", - "description": - "The runtime configuration for a blockchain fork intended to be a continuation of the current one. By default, this returns the newest block that appeared before the transaction stop slot provided in the configuration, or the best tip if no such block exists.", + "description": "The runtime configuration for a blockchain fork intended to be a continuation of the current one. By default, this returns the newest block that appeared before the transaction stop slot provided in the configuration, or the best tip if no such block exists.", "args": [ { "name": "height", - "description": - "The height of the desired block in the best chain", - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, + "description": "The height of the desired block in the best chain", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, "defaultValue": null }, { @@ -15910,8 +16198,7 @@ }, { "name": "threadGraph", - "description": - "A graphviz dot format representation of the deamon's internal thread graph", + "description": "A graphviz dot format representation of the deamon's internal thread graph", "args": [], "type": { "kind": "NON_NULL", @@ -15927,8 +16214,7 @@ }, { "name": "blockchainVerificationKey", - "description": - "The pickles verification key for the protocol state proof", + "description": "The pickles verification key for the protocol state proof", "args": [], "type": { "kind": "NON_NULL", @@ -15944,8 +16230,7 @@ }, { "name": "networkID", - "description": - "The chain-agnostic identifier of the network this daemon is participating in", + "description": "The chain-agnostic identifier of the network this daemon is participating in", "args": [], "type": { "kind": "NON_NULL", @@ -15961,8 +16246,7 @@ }, { "name": "signatureKind", - "description": - "The signature kind that this daemon instance is using", + "description": "The signature kind that this daemon instance is using", "args": [], "type": { "kind": "NON_NULL", @@ -15978,8 +16262,7 @@ }, { "name": "protocolState", - "description": - "Get the protocol state for a given block, optionally encoded in Base64", + "description": "Get the protocol state for a given block, optionally encoded in Base64", "args": [ { "name": "encoding", @@ -15993,9 +16276,12 @@ }, { "name": "height", - "description": - "The height of the desired block in the best chain", - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, + "description": "The height of the desired block in the best chain", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, "defaultValue": null }, { @@ -16023,20 +16309,21 @@ }, { "name": "accountActions", - "description": - "Find all the actions associated to an account from the current best tip.", + "description": "Find all the actions associated to an account from the current best tip.", "args": [ { "name": "maxLength", - "description": - "The maximum number of blocks to search for actions. If there are more blocks in the transition frontier from root to tip, the maxLength blocks closest to the best tip will be returned", - "type": { "kind": "SCALAR", "name": "Int", "ofType": null }, + "description": "The maximum number of blocks to search for actions. If there are more blocks in the transition frontier from root to tip, the maxLength blocks closest to the best tip will be returned", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, "defaultValue": null }, { "name": "token", - "description": - "Token of account being retrieved (defaults to MINA)", + "description": "Token of account being retrieved (defaults to MINA)", "type": { "kind": "SCALAR", "name": "TokenId", @@ -16070,8 +16357,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "ActionState", - "ofType": null + "name": "ActionState" } } } @@ -16085,8 +16371,7 @@ "enumValues": null, "possibleTypes": null } - ], - "directives": [] + ] } } } From fdc5d4dd914f13f0bdbcb3a64fd5e025379f724b Mon Sep 17 00:00:00 2001 From: dkijania Date: Wed, 27 May 2026 11:40:33 +0200 Subject: [PATCH 2/2] Drift check: harden classifier and add coverage/infra-failure buckets Two-layer schema-drift checker for the SDK: 1. Introspection diff: compare src/mina_sdk/schema/graphql_schema.json to the live __schema; now also detects argument-type changes (e.g. UInt64 -> TokenId) and inputField-type changes that the previous version silently passed. 2. Live query check: parse src/mina_sdk/daemon/queries.py, send each operation with sentinel variables, classify GraphQL errors as either schema drift (parse/validation) or runtime (auth, value- validation). Drift patterns are matched against the message BEFORE the path-based runtime fallback - Mina attaches `path` to many validation errors, so a path-first short-circuit silently drops real drift to the runtime bucket. Bare "expected type" was removed from drift patterns (false-positives on value coercion); a regex for the "expected on field X, found Y" shape now routes those to runtime explicitly. Hardening from internal review: - httpx.Client with 30s timeout (was bare httpx.post call per request) - HTTP status check (non-2xx -> error; was relying on raise_for_status in one path and silently treating empty errors[] as OK in another) - normalize_schema raises on error envelopes - no silent fake-empty schema that then flags every type as REMOVED - _name_of sort key safe against null / non-dict entries - kind nil-guard avoids spurious " -> X" diffs - _OP_RE filters to bodies that actually start with an operation keyword, so unrelated triple-quoted constants don't get probed - _VARS_RE anchored to body start, so inner field-arg parens like `bestChain(maxLength: 1)` can't bind - Connection / HTTP errors counted as infra failures, not "drift"; always exits 1 (we can't trust the result either way) - SKIPped ops (stale sentinel table) fail in --strict Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/check_schema_drift.py | 471 +++++++++++++++++++++++++++------- 1 file changed, 373 insertions(+), 98 deletions(-) diff --git a/scripts/check_schema_drift.py b/scripts/check_schema_drift.py index b5be364..c00116a 100755 --- a/scripts/check_schema_drift.py +++ b/scripts/check_schema_drift.py @@ -1,26 +1,45 @@ #!/usr/bin/env python3 -"""Check for schema drift between the local GraphQL schema and a live Mina node. +"""Check for schema drift between the SDK and a live Mina node, in two layers: + + 1. Introspection diff: compare ``src/mina_sdk/schema/graphql_schema.json`` + to the live ``__schema`` returned by the daemon. + 2. Live query check: parse ``src/mina_sdk/daemon/queries.py``, send each + operation with sentinel variables, and classify GraphQL errors as + either schema drift (parse/validation) or runtime (auth, value-validation). + +Designed for a lightnet-style local daemon (see +``.github/workflows/schema-drift.yml`` for the CI setup); do not point at a +public node by default. Usage: python scripts/check_schema_drift.py --endpoint http://localhost:8080/graphql [--strict] Exit codes: - 0 - schemas match - 1 - schemas differ (only in --strict mode) - 2 - connection/introspection error + 0 - no drift (or non-strict mode) + 1 - drift detected in --strict mode + 2 - connection / introspection error """ from __future__ import annotations import argparse import json +import re import sys +from dataclasses import dataclass, field from pathlib import Path from typing import Any import httpx -SCHEMA_PATH = Path(__file__).resolve().parent.parent / "src" / "mina_sdk" / "schema" / "graphql_schema.json" +REPO_ROOT = Path(__file__).resolve().parent.parent +SCHEMA_PATH = REPO_ROOT / "src" / "mina_sdk" / "schema" / "graphql_schema.json" +QUERIES_PATH = REPO_ROOT / "src" / "mina_sdk" / "daemon" / "queries.py" + +# Sentinel addresses — syntactically valid B62q keys. The daemon may not have +# the corresponding accounts, but the schema layer will still validate. +SENTINEL_SENDER = "B62qpRzFVjd56FiHnNfxokVbcHMQLT119My1FEdSq8ss7KomLiSZcan" +SENTINEL_RECEIVER = "B62qrPN5Y5yq8kGE3FbVKbGTdTAJNdtNtB5sNVpxyRwWGcDEhpMzc8g" INTROSPECTION_QUERY = """ query IntrospectionQuery { @@ -120,28 +139,57 @@ """ -def normalize_schema(schema: dict[str, Any]) -> dict[str, Any]: - """Normalize a schema for stable comparison by sorting all lists deterministically.""" - data = schema.get("data", schema) - s = data.get("__schema", data) +# ───────────────────────────────────────────────────────────────────────────── +# Layer 1: introspection diff +# ───────────────────────────────────────────────────────────────────────────── + + +def _name_of(item: Any) -> str: + """Safe name extractor — returns '' for non-dict / missing-name entries + so sorting never panics on `null` entries in introspection arrays.""" + if isinstance(item, dict): + n = item.get("name") + if isinstance(n, str): + return n + return "" + - types_list = sorted(s.get("types", []), key=lambda t: t.get("name", "")) +def normalize_schema(schema: dict[str, Any]) -> dict[str, Any]: + """Normalize a schema for stable comparison. Raises ValueError if the + response is an error envelope without data.__schema, instead of silently + returning a fake empty schema.""" + data = schema.get("data") if isinstance(schema.get("data"), dict) else schema + sc = data.get("__schema") if isinstance(data, dict) else None + if not isinstance(sc, dict): + if schema.get("errors"): + raise ValueError( + f"introspection returned errors envelope (no data.__schema): {schema['errors']}" + ) + raise ValueError("introspection response missing data.__schema") + s = sc + types_raw = s.get("types") + if not isinstance(types_raw, list): + raise ValueError(f"introspection __schema.types is not a list (got {type(types_raw).__name__})") + + types_list = sorted(types_raw, key=_name_of) normalized_types = [] for t in types_list: + if not isinstance(t, dict): + continue nt = dict(t) if nt.get("fields"): - nt["fields"] = sorted(nt["fields"], key=lambda f: f.get("name", "")) + nt["fields"] = sorted(nt["fields"], key=_name_of) for field in nt["fields"]: - if field.get("args"): - field["args"] = sorted(field["args"], key=lambda a: a.get("name", "")) + if isinstance(field, dict) and field.get("args"): + field["args"] = sorted(field["args"], key=_name_of) if nt.get("inputFields"): - nt["inputFields"] = sorted(nt["inputFields"], key=lambda f: f.get("name", "")) + nt["inputFields"] = sorted(nt["inputFields"], key=_name_of) if nt.get("enumValues"): - nt["enumValues"] = sorted(nt["enumValues"], key=lambda e: e.get("name", "")) + nt["enumValues"] = sorted(nt["enumValues"], key=_name_of) if nt.get("interfaces"): - nt["interfaces"] = sorted(nt["interfaces"], key=lambda i: i.get("name", "")) + nt["interfaces"] = sorted(nt["interfaces"], key=_name_of) if nt.get("possibleTypes"): - nt["possibleTypes"] = sorted(nt["possibleTypes"], key=lambda p: p.get("name", "")) + nt["possibleTypes"] = sorted(nt["possibleTypes"], key=_name_of) normalized_types.append(nt) return { @@ -152,134 +200,361 @@ def normalize_schema(schema: dict[str, Any]) -> dict[str, Any]: } -def compute_diff(local: dict[str, Any], remote: dict[str, Any]) -> list[str]: +def compute_schema_diff(local: dict[str, Any], remote: dict[str, Any]) -> list[str]: """Compute human-readable differences between two normalized schemas.""" diffs: list[str] = [] local_types = {t["name"]: t for t in local["types"]} remote_types = {t["name"]: t for t in remote["types"]} - local_names = set(local_types.keys()) - remote_names = set(remote_types.keys()) - - for name in sorted(local_names - remote_names): - diffs.append(f" REMOVED type: {name}") - for name in sorted(remote_names - local_names): - diffs.append(f" ADDED type: {name}") + for name in sorted(set(local_types) - set(remote_types)): + diffs.append(f"REMOVED type: {name}") + for name in sorted(set(remote_types) - set(local_types)): + diffs.append(f"ADDED type: {name}") - for name in sorted(local_names & remote_names): + for name in sorted(set(local_types) & set(remote_types)): lt = local_types[name] rt = remote_types[name] + # Only flag kind change when both sides set it — otherwise a partial + # local dump emits a spurious " -> OBJECT" per type. + if lt.get("kind") is not None and rt.get("kind") is not None and lt["kind"] != rt["kind"]: + diffs.append(f"CHANGED {name}: kind {lt['kind']} -> {rt['kind']}") - if lt.get("kind") != rt.get("kind"): - diffs.append(f" CHANGED {name}: kind {lt.get('kind')} -> {rt.get('kind')}") - - # Compare fields local_fields = {f["name"]: f for f in (lt.get("fields") or [])} remote_fields = {f["name"]: f for f in (rt.get("fields") or [])} for fname in sorted(set(local_fields) - set(remote_fields)): - diffs.append(f" REMOVED field: {name}.{fname}") + diffs.append(f"REMOVED field: {name}.{fname}") for fname in sorted(set(remote_fields) - set(local_fields)): - diffs.append(f" ADDED field: {name}.{fname}") + diffs.append(f"ADDED field: {name}.{fname}") for fname in sorted(set(local_fields) & set(remote_fields)): lf = local_fields[fname] rf = remote_fields[fname] if lf.get("type") != rf.get("type"): - diffs.append(f" CHANGED field type: {name}.{fname}") - # Compare args + diffs.append(f"CHANGED field type: {name}.{fname}") local_args = {a["name"]: a for a in (lf.get("args") or [])} remote_args = {a["name"]: a for a in (rf.get("args") or [])} for aname in sorted(set(local_args) - set(remote_args)): - diffs.append(f" REMOVED arg: {name}.{fname}({aname})") + diffs.append(f"REMOVED arg: {name}.{fname}({aname})") for aname in sorted(set(remote_args) - set(local_args)): - diffs.append(f" ADDED arg: {name}.{fname}({aname})") + diffs.append(f"ADDED arg: {name}.{fname}({aname})") + # Compare arg types for shared keys — a scalar swap like + # account(token: UInt64 -> TokenId) is invisible without this. + for aname in sorted(set(local_args) & set(remote_args)): + if local_args[aname].get("type") != remote_args[aname].get("type"): + diffs.append(f"CHANGED arg type: {name}.{fname}({aname})") - # Compare inputFields local_inputs = {f["name"]: f for f in (lt.get("inputFields") or [])} remote_inputs = {f["name"]: f for f in (rt.get("inputFields") or [])} for fname in sorted(set(local_inputs) - set(remote_inputs)): - diffs.append(f" REMOVED inputField: {name}.{fname}") + diffs.append(f"REMOVED inputField: {name}.{fname}") for fname in sorted(set(remote_inputs) - set(local_inputs)): - diffs.append(f" ADDED inputField: {name}.{fname}") + diffs.append(f"ADDED inputField: {name}.{fname}") + # Compare inputField types for shared keys. + for fname in sorted(set(local_inputs) & set(remote_inputs)): + if local_inputs[fname].get("type") != remote_inputs[fname].get("type"): + diffs.append(f"CHANGED inputField type: {name}.{fname}") - # Compare enumValues local_enums = {e["name"] for e in (lt.get("enumValues") or [])} remote_enums = {e["name"] for e in (rt.get("enumValues") or [])} for ename in sorted(local_enums - remote_enums): - diffs.append(f" REMOVED enumValue: {name}.{ename}") + diffs.append(f"REMOVED enumValue: {name}.{ename}") for ename in sorted(remote_enums - local_enums): - diffs.append(f" ADDED enumValue: {name}.{ename}") + diffs.append(f"ADDED enumValue: {name}.{ename}") return diffs -def fetch_remote_schema(endpoint: str, timeout: float = 60.0) -> dict[str, Any]: - """Fetch schema via introspection query from a live Mina node.""" - resp = httpx.post( - endpoint, - json={"query": INTROSPECTION_QUERY}, - timeout=timeout, - ) - resp.raise_for_status() +# ───────────────────────────────────────────────────────────────────────────── +# Layer 2: live query check +# ───────────────────────────────────────────────────────────────────────────── + + +_OP_RE = re.compile(r'^(\w+)\s*=\s*"""(.*?)"""', re.MULTILINE | re.DOTALL) +# Anchor at the start of the body — without ^, varsRe could bind to inner +# field-arg parens like `bestChain(maxLength: 1)`. +_VARS_RE = re.compile(r"^\s*(?:query|mutation|subscription)(?:\s+\w+)?\s*\(([^)]*)\)", re.DOTALL) +_DECL_RE = re.compile(r"^\$(\w+)\s*:\s*([\w!\[\]]+)") +_OPERATION_START_RE = re.compile(r"^\s*(query|mutation|subscription)\b", re.IGNORECASE) + + +def parse_queries(src: str) -> list[tuple[str, str]]: + """Extract NAME = \"\"\"...\"\"\" pairs whose body is an actual GraphQL + operation. Filters out unrelated triple-quoted constants in the module.""" + out: list[tuple[str, str]] = [] + seen: set[str] = set() + for m in _OP_RE.finditer(src): + name, body = m.group(1), m.group(2) + if name in seen: + continue + if not _OPERATION_START_RE.match(body): + continue + seen.add(name) + out.append((name, body)) + return out + + +def parse_variable_decls(body: str) -> list[tuple[str, str]]: + """Pull ($var: Type[!], ...) out of an operation header.""" + m = _VARS_RE.search(body) + if not m: + return [] + decls: list[tuple[str, str]] = [] + for raw in m.group(1).split(","): + raw = raw.strip() + if not raw: + continue + d = _DECL_RE.match(raw) + if d: + decls.append((d.group(1), d.group(2))) + return decls + + +def sentinel_for_type(type_name: str) -> Any: + base = re.sub(r"[\[\]!]", "", type_name) + return { + "PublicKey": SENTINEL_SENDER, + "UInt32": "1000000000", + "UInt64": "1000000000", + "Fee": "1000000000", + "Balance": "1000000000", + "Int": 1, + "String": "1", + "TokenId": "1", + "Boolean": True, + "SendPaymentInput": { + "from": SENTINEL_SENDER, + "to": SENTINEL_RECEIVER, + "amount": "1000000000", + "fee": "1000000000", + }, + "SendDelegationInput": { + "from": SENTINEL_SENDER, + "to": SENTINEL_RECEIVER, + "fee": "1000000000", + }, + "SetSnarkWorkerInput": {"publicKey": SENTINEL_SENDER}, + "SetSnarkWorkFee": {"fee": "1000000000"}, + }.get(base, None) + + +def build_variables(decls: list[tuple[str, str]]) -> dict[str, Any] | None: + vars: dict[str, Any] = {} + for name, typ in decls: + v = sentinel_for_type(typ) + if v is None: + return None + vars[name] = v + return vars + + +# Case-insensitive substrings that uniquely identify schema-level errors +# emitted by Mina's GraphQL surface (graphql-ppx / OCaml). We deliberately +# omit bare "expected type" because it appears in both real drift and in +# value-coercion runtime errors ("Expected type Foo, found Bar"); the +# `_VALUE_COERCION_RE` below catches the runtime variant explicitly. +_DRIFT_PATTERNS = ( + "cannot query field", + "unknown argument", + "unknown type", + "is not defined", + "is not a subtype", + "is required", + "but not provided", + "used in position expecting type", + "must have a sub selection", + "did you mean", + "unknown directive", +) + +# Matches Mina's "Argument X of type Y expected on field Z, found " +# — value validation, not schema drift. +_VALUE_COERCION_RE = re.compile(r"expected on field .* found ", re.IGNORECASE) + + +def classify_error(err: dict[str, Any]) -> str: + """Decide whether a GraphQL error reflects schema drift or runtime + failure. Message-pattern match takes priority over `path` — Mina attaches + `path` to many validation errors, so a path-first short-circuit silently + drops real drift to the runtime bucket.""" + msg = err.get("message") or "" + lc = msg.lower() + if any(p in lc for p in _DRIFT_PATTERNS): + return "drift" + if _VALUE_COERCION_RE.search(msg): + return "runtime" + if err.get("path"): + return "runtime" + # Unknown error shape — surface as drift so silent breakage is visible + # in --strict mode at least. + return "drift" + + +_http_client = httpx.Client(timeout=30.0) + + +def post_graphql(endpoint: str, payload: dict[str, Any]) -> dict[str, Any]: + resp = _http_client.post(endpoint, json=payload) + if resp.status_code < 200 or resp.status_code >= 300: + snippet = resp.text + if len(snippet) > 200: + snippet = snippet[:200] + "…" + raise RuntimeError(f"HTTP {resp.status_code} {resp.reason_phrase}: {snippet}") return resp.json() -def main() -> int: - parser = argparse.ArgumentParser(description="Check GraphQL schema drift against a Mina node") - parser.add_argument( - "--endpoint", - default="http://127.0.0.1:8080/graphql", - help="Mina node GraphQL endpoint (default: http://127.0.0.1:8080/graphql)", - ) - parser.add_argument( - "--strict", - action="store_true", - help="Exit with code 1 on schema differences (default: warn only)", - ) - parser.add_argument( - "--branch", - default="unknown", - help="Branch label for log messages (e.g. master, compatible, develop)", - ) - args = parser.parse_args() +@dataclass +class QueryStats: + ok: int = 0 + runtime: int = 0 + drift: list[str] = field(default_factory=list) + skipped: list[str] = field(default_factory=list) # coverage gaps (stale sentinel table) + failures: list[str] = field(default_factory=list) # infra (HTTP / network / parse) - # Load local schema - try: - local_raw = json.loads(SCHEMA_PATH.read_text()) - except (FileNotFoundError, json.JSONDecodeError) as e: - print(f"ERROR: Cannot load local schema from {SCHEMA_PATH}: {e}", file=sys.stderr) - return 2 - # Fetch remote schema +def _missing_sentinel_types(decls: list[tuple[str, str]]) -> list[str]: + seen: set[str] = set() + out: list[str] = [] + for _, typ in decls: + if sentinel_for_type(typ) is None and typ not in seen: + seen.add(typ) + out.append(typ) + return out + + +def run_query_layer(endpoint: str) -> QueryStats: + stats = QueryStats() try: - print(f"Fetching schema from {args.endpoint} (branch: {args.branch})...") - remote_raw = fetch_remote_schema(args.endpoint) - except (httpx.HTTPError, Exception) as e: - print(f"ERROR: Cannot fetch remote schema: {e}", file=sys.stderr) - return 2 - - # Normalize and compare - local_norm = normalize_schema(local_raw) - remote_norm = normalize_schema(remote_raw) - - if local_norm == remote_norm: - print(f"OK: Local schema matches {args.branch} node schema.") - return 0 + src = QUERIES_PATH.read_text() + except OSError as e: + print(f"FAIL: cannot read queries module: {e}") + stats.failures.append(f"read queries module: {e}") + return stats + ops = parse_queries(src) + if not ops: + print("WARN: no operations parsed from queries module") + stats.failures.append("no operations parsed from queries module") + return stats + + for name, body in ops: + decls = parse_variable_decls(body) + vars_ = build_variables(decls) + if vars_ is None: + missing = _missing_sentinel_types(decls) + print(f"SKIP {name} (no sentinel for: {', '.join(missing)})") + stats.skipped.append(f"{name}: missing sentinel for {', '.join(missing)}") + continue + + try: + result = post_graphql(endpoint, {"query": body, "variables": vars_}) + except (httpx.HTTPError, RuntimeError, ValueError) as e: + print(f"FAIL {name}: {e}") + stats.failures.append(f"{name}: {e}") + continue + + errors = result.get("errors") or [] + if not errors: + print(f"OK {name}") + stats.ok += 1 + continue + + classified = [(classify_error(e), e) for e in errors] + drift_errs = [e for kind, e in classified if kind == "drift"] + if drift_errs: + msgs = "; ".join(e.get("message", "") for e in drift_errs) + print(f"DRIFT {name}: {msgs}") + stats.drift.append(f"{name}: {msgs}") + else: + msgs = "; ".join(e.get("message", "") for _, e in classified) + print(f"RUNTIME {name}: {msgs}") + stats.runtime += 1 + + return stats + + +# ───────────────────────────────────────────────────────────────────────────── +# Main +# ───────────────────────────────────────────────────────────────────────────── - diffs = compute_diff(local_norm, remote_norm) - level = "ERROR" if args.strict else "WARNING" - print(f"\n{level}: Schema drift detected against {args.branch} ({len(diffs)} difference(s)):\n") - for d in diffs: - print(d) - print() +def main() -> int: + parser = argparse.ArgumentParser(description="Check GraphQL schema drift against a Mina node") + parser.add_argument("--endpoint", default="http://127.0.0.1:8080/graphql") + parser.add_argument("--strict", action="store_true") + parser.add_argument("--branch", default="unknown") + parser.add_argument("--skip-schema", action="store_true") + parser.add_argument("--skip-queries", action="store_true") + args = parser.parse_args() + + schema_diff: list[str] = [] + + if not args.skip_schema: + print(f"\n── Layer 1: schema introspection ({args.branch}) ──") + try: + local_raw = json.loads(SCHEMA_PATH.read_text()) + except (FileNotFoundError, json.JSONDecodeError) as e: + print(f"ERROR: Cannot load local schema from {SCHEMA_PATH}: {e}", file=sys.stderr) + return 2 + + try: + print(f"Fetching introspection from {args.endpoint}...") + remote_raw = post_graphql(args.endpoint, {"query": INTROSPECTION_QUERY}) + except (httpx.HTTPError, RuntimeError, ValueError) as e: + print(f"ERROR: Cannot fetch remote schema: {e}", file=sys.stderr) + return 2 + + try: + local = normalize_schema(local_raw) + remote = normalize_schema(remote_raw) + except ValueError as e: + print(f"ERROR: malformed schema: {e}", file=sys.stderr) + return 2 + + schema_diff = compute_schema_diff(local, remote) + if not schema_diff: + print("OK: local schema matches node schema") + else: + print(f"Schema drift: {len(schema_diff)} difference(s)") + for d in schema_diff: + print(f" {d}") + + qstats = QueryStats() + if not args.skip_queries: + print(f"\n── Layer 2: live query check ({args.branch}) ──") + qstats = run_query_layer(args.endpoint) + print( + f"\nResults: {qstats.ok} ok, {len(qstats.drift)} drift, {qstats.runtime} runtime, " + f"{len(qstats.skipped)} skipped, {len(qstats.failures)} infra-failures" + ) + + print(f"\n── Summary ({args.branch}) ──") + if args.skip_schema: + print("Schema diffs: SKIPPED") + else: + print(f"Schema diffs: {len(schema_diff)}") + if args.skip_queries: + print("Query drift: SKIPPED") + else: + print(f"Query drift: {len(qstats.drift)}") + print(f"Skipped (cov): {len(qstats.skipped)}") + print(f"Infra failures: {len(qstats.failures)}") + + # Infra failures always fail — we can't trust the result if we couldn't + # talk to the daemon. + if qstats.failures: + print("FAIL: infrastructure errors prevented a clean check") + return 1 + total_drift = len(schema_diff) + len(qstats.drift) + if total_drift == 0 and not qstats.skipped: + print("OK: no drift detected") + return 0 if args.strict: - print("FAIL: Schema is out of sync with the node. Update src/mina_sdk/schema/graphql_schema.json") + # In strict mode, skipped ops are also a failure: we can't claim the + # SDK is in sync if we couldn't probe parts of it. + print("FAIL: drift or coverage gap detected in --strict mode") return 1 - else: - print(f"WARN: Schema differs from {args.branch} (non-blocking).") - return 0 + print(f"WARN: drift or coverage gap differs from {args.branch} (non-blocking).") + return 0 if __name__ == "__main__":