abel-ghost-sdk 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -50,6 +50,14 @@ export type BalanceInfo = {
50
50
  * Converts the ABI tuple representation of a BalanceInfo to the struct representation
51
51
  */
52
52
  export declare function BalanceInfoFromTuple(abiTuple: [bigint, bigint]): BalanceInfo;
53
+ export type BlockTimeAndTc = {
54
+ ts: number;
55
+ tc: bigint;
56
+ };
57
+ /**
58
+ * Converts the ABI tuple representation of a BlockTimeAndTc to the struct representation
59
+ */
60
+ export declare function BlockTimeAndTcFromTuple(abiTuple: [number, bigint]): BlockTimeAndTc;
53
61
  /**
54
62
  * Deploy-time template variables
55
63
  */
@@ -74,6 +82,10 @@ export type AbelReaderArgs = {
74
82
  'get_asset_labels(asset)string[]': {
75
83
  assetId: bigint;
76
84
  };
85
+ 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)': {
86
+ firstRound: bigint | number;
87
+ lastRound: bigint | number;
88
+ };
77
89
  };
78
90
  /**
79
91
  * The tuple representation of the arguments for each method
@@ -82,6 +94,7 @@ export type AbelReaderArgs = {
82
94
  'getBalanceInfo(address[])(uint64,uint64)': [accounts: string[]];
83
95
  'getAssetsTiny(uint64[],uint64)(string,string,uint8,string[])': [assetIds: bigint[] | number[], abelAppId: bigint | number];
84
96
  'get_asset_labels(asset)string[]': [assetId: bigint];
97
+ 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)': [firstRound: bigint | number, lastRound: bigint | number];
85
98
  };
86
99
  };
87
100
  /**
@@ -91,6 +104,7 @@ export type AbelReaderReturns = {
91
104
  'getBalanceInfo(address[])(uint64,uint64)': BalanceInfo;
92
105
  'getAssetsTiny(uint64[],uint64)(string,string,uint8,string[])': AssetTinyLabels;
93
106
  'get_asset_labels(asset)string[]': string[];
107
+ 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)': BlockTimeAndTc;
94
108
  };
95
109
  /**
96
110
  * Defines the types of available calls and state of the AbelReader smart contract.
@@ -111,6 +125,10 @@ export type AbelReaderTypes = {
111
125
  argsObj: AbelReaderArgs['obj']['get_asset_labels(asset)string[]'];
112
126
  argsTuple: AbelReaderArgs['tuple']['get_asset_labels(asset)string[]'];
113
127
  returns: AbelReaderReturns['get_asset_labels(asset)string[]'];
128
+ }> & Record<'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)' | 'getBlockTimesAndTc', {
129
+ argsObj: AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'];
130
+ argsTuple: AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'];
131
+ returns: AbelReaderReturns['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'];
114
132
  }>;
115
133
  };
116
134
  /**
@@ -163,6 +181,14 @@ export type AbelReaderCreateCallParams = Expand<CallParams<AbelReaderArgs['obj']
163
181
  method: 'get_asset_labels(asset)string[]';
164
182
  } & {
165
183
  onComplete?: OnApplicationComplete.NoOpOC;
184
+ } & CreateSchema> | Expand<CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & {
185
+ method: 'getBlockTimesAndTc';
186
+ } & {
187
+ onComplete?: OnApplicationComplete.NoOpOC;
188
+ } & CreateSchema> | Expand<CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & {
189
+ method: 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)';
190
+ } & {
191
+ onComplete?: OnApplicationComplete.NoOpOC;
166
192
  } & CreateSchema>;
167
193
  /**
168
194
  * Defines supported update method params for this smart contract
@@ -260,6 +286,17 @@ export declare abstract class AbelReaderParamsFactory {
260
286
  }): AppClientMethodCallParams & AppClientCompilationParams & {
261
287
  onComplete?: OnApplicationComplete.NoOpOC;
262
288
  };
289
+ /**
290
+ * Constructs create ABI call params for the AbelReader smart contract using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method
291
+ *
292
+ * @param params Parameters for the call
293
+ * @returns An `AppClientMethodCallParams` object for the call
294
+ */
295
+ getBlockTimesAndTc(params: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & AppClientCompilationParams & {
296
+ onComplete?: OnApplicationComplete.NoOpOC;
297
+ }): AppClientMethodCallParams & AppClientCompilationParams & {
298
+ onComplete?: OnApplicationComplete.NoOpOC;
299
+ };
263
300
  };
264
301
  /**
265
302
  * Constructs a no op call for the getBalanceInfo(address[])(uint64,uint64) ABI method
@@ -282,6 +319,13 @@ export declare abstract class AbelReaderParamsFactory {
282
319
  * @returns An `AppClientMethodCallParams` object for the call
283
320
  */
284
321
  static getAssetLabels(params: CallParams<AbelReaderArgs['obj']['get_asset_labels(asset)string[]'] | AbelReaderArgs['tuple']['get_asset_labels(asset)string[]']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete;
322
+ /**
323
+ * Constructs a no op call for the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method
324
+ *
325
+ * @param params Parameters for the call
326
+ * @returns An `AppClientMethodCallParams` object for the call
327
+ */
328
+ static getBlockTimesAndTc(params: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete;
285
329
  }
286
330
  /**
287
331
  * A factory to create and deploy one or more instance of the AbelReader smart contract and to create one or more app clients to interact with those (or other) app instances
@@ -368,7 +412,9 @@ declare class AbelReaderFactory {
368
412
  version: string;
369
413
  deletable?: boolean | undefined;
370
414
  updatable?: boolean | undefined;
371
- groupId: string;
415
+ groupId: string; /**
416
+ * Send calls to the current app
417
+ */
372
418
  txIds: string[];
373
419
  returns?: ABIReturn[] | undefined;
374
420
  confirmations: modelsv2.PendingTransactionResponse[];
@@ -726,6 +772,106 @@ declare class AbelReaderFactory {
726
772
  }> | undefined)[] | undefined;
727
773
  onComplete: OnApplicationComplete.NoOpOC | OnApplicationComplete.OptInOC | OnApplicationComplete.CloseOutOC | OnApplicationComplete.UpdateApplicationOC | OnApplicationComplete.DeleteApplicationOC;
728
774
  }>;
775
+ /**
776
+ * Creates a new instance of the AbelReader smart contract using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
777
+ *
778
+ * @param params The params for the smart contract call
779
+ * @returns The create params
780
+ */
781
+ getBlockTimesAndTc: (params: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & AppClientCompilationParams & CreateSchema & {
782
+ onComplete?: OnApplicationComplete.NoOpOC;
783
+ }) => Promise<{
784
+ deployTimeParams: import("@algorandfoundation/algokit-utils/types/app").TealTemplateParams | undefined;
785
+ schema: {
786
+ globalInts: number;
787
+ globalByteSlices: number;
788
+ localInts: number;
789
+ localByteSlices: number;
790
+ };
791
+ approvalProgram: Uint8Array;
792
+ clearStateProgram: Uint8Array;
793
+ maxFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
794
+ note?: string | Uint8Array | undefined;
795
+ signer?: TransactionSigner | import("@algorandfoundation/algokit-utils/types/account").TransactionSignerAccount | undefined;
796
+ onComplete?: OnApplicationComplete.NoOpOC | OnApplicationComplete.OptInOC | OnApplicationComplete.CloseOutOC | OnApplicationComplete.UpdateApplicationOC | OnApplicationComplete.DeleteApplicationOC | undefined;
797
+ rejectVersion?: number | undefined;
798
+ lease?: string | Uint8Array | undefined;
799
+ rekeyTo?: string | Address | undefined;
800
+ staticFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
801
+ extraFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
802
+ validityWindow?: number | bigint | undefined;
803
+ firstValidRound?: bigint | undefined;
804
+ lastValidRound?: bigint | undefined;
805
+ accountReferences?: (string | Address)[] | undefined;
806
+ appReferences?: bigint[] | undefined;
807
+ assetReferences?: bigint[] | undefined;
808
+ boxReferences?: (import("@algorandfoundation/algokit-utils/types/app-manager").BoxReference | import("@algorandfoundation/algokit-utils/types/app-manager").BoxIdentifier)[] | undefined;
809
+ accessReferences?: import("@algorandfoundation/algokit-utils/types/app-manager").ResourceReference[] | undefined;
810
+ sender?: string | Address | undefined;
811
+ method: string;
812
+ args?: (import("algosdk").ABIValue | import("@algorandfoundation/algokit-utils/types/app-arc56").ABIStruct | AppMethodCallTransactionArgument | undefined)[] | undefined;
813
+ updatable?: boolean | undefined;
814
+ deletable?: boolean | undefined;
815
+ extraProgramPages?: number | undefined;
816
+ } & {
817
+ sender: Address;
818
+ signer: TransactionSigner | import("@algorandfoundation/algokit-utils/types/account").TransactionSignerAccount | undefined;
819
+ method: import("@algorandfoundation/algokit-utils/types/app-arc56").Arc56Method;
820
+ args: (import("algosdk").ABIValue | import("algosdk").TransactionWithSigner | Transaction | Promise<Transaction> | import("@algorandfoundation/algokit-utils/types/composer").AppMethodCall<import("@algorandfoundation/algokit-utils/types/composer").AppMethodCallParams> | import("@algorandfoundation/algokit-utils/types/composer").AppMethodCall<{
821
+ sender: string | Address;
822
+ maxFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
823
+ note?: string | Uint8Array | undefined;
824
+ args?: Uint8Array[] | undefined;
825
+ signer?: TransactionSigner | import("@algorandfoundation/algokit-utils/types/account").TransactionSignerAccount | undefined;
826
+ onComplete?: OnApplicationComplete.NoOpOC | OnApplicationComplete.OptInOC | OnApplicationComplete.CloseOutOC | OnApplicationComplete.UpdateApplicationOC | OnApplicationComplete.DeleteApplicationOC | undefined;
827
+ rejectVersion?: number | undefined;
828
+ lease?: string | Uint8Array | undefined;
829
+ rekeyTo?: string | Address | undefined;
830
+ staticFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
831
+ extraFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
832
+ validityWindow?: number | bigint | undefined;
833
+ firstValidRound?: bigint | undefined;
834
+ lastValidRound?: bigint | undefined;
835
+ accountReferences?: (string | Address)[] | undefined;
836
+ appReferences?: bigint[] | undefined;
837
+ assetReferences?: bigint[] | undefined;
838
+ boxReferences?: (import("@algorandfoundation/algokit-utils/types/app-manager").BoxReference | import("@algorandfoundation/algokit-utils/types/app-manager").BoxIdentifier)[] | undefined;
839
+ accessReferences?: import("@algorandfoundation/algokit-utils/types/app-manager").ResourceReference[] | undefined;
840
+ approvalProgram: string | Uint8Array;
841
+ clearStateProgram: string | Uint8Array;
842
+ schema?: {
843
+ globalInts: number;
844
+ globalByteSlices: number;
845
+ localInts: number;
846
+ localByteSlices: number;
847
+ } | undefined;
848
+ extraProgramPages?: number | undefined;
849
+ }> | import("@algorandfoundation/algokit-utils/types/composer").AppMethodCall<{
850
+ sender: string | Address;
851
+ signer?: TransactionSigner | import("@algorandfoundation/algokit-utils/types/account").TransactionSignerAccount | undefined;
852
+ rekeyTo?: string | Address | undefined;
853
+ note?: string | Uint8Array | undefined;
854
+ lease?: string | Uint8Array | undefined;
855
+ staticFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
856
+ extraFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
857
+ maxFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
858
+ validityWindow?: number | bigint | undefined;
859
+ firstValidRound?: bigint | undefined;
860
+ lastValidRound?: bigint | undefined;
861
+ appId: bigint;
862
+ onComplete?: OnApplicationComplete.UpdateApplicationOC | undefined;
863
+ args?: Uint8Array[] | undefined;
864
+ accountReferences?: (string | Address)[] | undefined;
865
+ appReferences?: bigint[] | undefined;
866
+ assetReferences?: bigint[] | undefined;
867
+ boxReferences?: (import("@algorandfoundation/algokit-utils/types/app-manager").BoxReference | import("@algorandfoundation/algokit-utils/types/app-manager").BoxIdentifier)[] | undefined;
868
+ accessReferences?: import("@algorandfoundation/algokit-utils/types/app-manager").ResourceReference[] | undefined;
869
+ rejectVersion?: number | undefined;
870
+ approvalProgram: string | Uint8Array;
871
+ clearStateProgram: string | Uint8Array;
872
+ }> | undefined)[] | undefined;
873
+ onComplete: OnApplicationComplete.NoOpOC | OnApplicationComplete.OptInOC | OnApplicationComplete.CloseOutOC | OnApplicationComplete.UpdateApplicationOC | OnApplicationComplete.DeleteApplicationOC;
874
+ }>;
729
875
  };
730
876
  /**
731
877
  * Gets available deployUpdate methods
@@ -845,6 +991,19 @@ declare class AbelReaderFactory {
845
991
  methodCalls: Map<number, import("algosdk").ABIMethod>;
846
992
  signers: Map<number, TransactionSigner>;
847
993
  }>;
994
+ /**
995
+ * Creates a new instance of the AbelReader smart contract using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
996
+ *
997
+ * @param params The params for the smart contract call
998
+ * @returns The create transaction
999
+ */
1000
+ getBlockTimesAndTc: (params: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & AppClientCompilationParams & CreateSchema & {
1001
+ onComplete?: OnApplicationComplete.NoOpOC;
1002
+ }) => Promise<{
1003
+ transactions: Transaction[];
1004
+ methodCalls: Map<number, import("algosdk").ABIMethod>;
1005
+ signers: Map<number, TransactionSigner>;
1006
+ }>;
848
1007
  };
849
1008
  };
850
1009
  /**
@@ -870,10 +1029,6 @@ declare class AbelReaderFactory {
870
1029
  compiledClear?: import("@algorandfoundation/algokit-utils/types/app").CompiledTeal | undefined;
871
1030
  appId: bigint;
872
1031
  groupId: string;
873
- /**
874
- * Checks for decode errors on the given return value and maps the return value to the return type for the given method
875
- * @returns The typed return value or undefined if there was no value
876
- */
877
1032
  txIds: string[];
878
1033
  returns?: ABIReturn[] | undefined;
879
1034
  confirmations: modelsv2.PendingTransactionResponse[];
@@ -899,10 +1054,6 @@ declare class AbelReaderFactory {
899
1054
  compiledClear?: import("@algorandfoundation/algokit-utils/types/app").CompiledTeal | undefined;
900
1055
  appId: bigint;
901
1056
  groupId: string;
902
- /**
903
- * Checks for decode errors on the given return value and maps the return value to the return type for the given method
904
- * @returns The typed return value or undefined if there was no value
905
- */
906
1057
  txIds: string[];
907
1058
  returns?: ABIReturn[] | undefined;
908
1059
  confirmations: modelsv2.PendingTransactionResponse[];
@@ -928,10 +1079,31 @@ declare class AbelReaderFactory {
928
1079
  compiledClear?: import("@algorandfoundation/algokit-utils/types/app").CompiledTeal | undefined;
929
1080
  appId: bigint;
930
1081
  groupId: string;
931
- /**
932
- * Checks for decode errors on the given return value and maps the return value to the return type for the given method
933
- * @returns The typed return value or undefined if there was no value
934
- */
1082
+ txIds: string[];
1083
+ returns?: ABIReturn[] | undefined;
1084
+ confirmations: modelsv2.PendingTransactionResponse[];
1085
+ transactions: Transaction[];
1086
+ confirmation: modelsv2.PendingTransactionResponse;
1087
+ transaction: Transaction;
1088
+ appAddress: Address;
1089
+ };
1090
+ appClient: AbelReaderClient;
1091
+ }>;
1092
+ /**
1093
+ * Creates a new instance of the AbelReader smart contract using an ABI method call using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
1094
+ *
1095
+ * @param params The params for the smart contract call
1096
+ * @returns The create result
1097
+ */
1098
+ getBlockTimesAndTc: (params: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & AppClientCompilationParams & CreateSchema & SendParams & {
1099
+ onComplete?: OnApplicationComplete.NoOpOC;
1100
+ }) => Promise<{
1101
+ result: {
1102
+ return: BlockTimeAndTc | undefined;
1103
+ compiledApproval?: import("@algorandfoundation/algokit-utils/types/app").CompiledTeal | undefined;
1104
+ compiledClear?: import("@algorandfoundation/algokit-utils/types/app").CompiledTeal | undefined;
1105
+ appId: bigint;
1106
+ groupId: string;
935
1107
  txIds: string[];
936
1108
  returns?: ABIReturn[] | undefined;
937
1109
  confirmations: modelsv2.PendingTransactionResponse[];
@@ -1019,9 +1191,7 @@ declare class AbelReaderClient {
1019
1191
  maxFee?: import("@algorandfoundation/algokit-utils/types/amount").AlgoAmount | undefined;
1020
1192
  validityWindow?: number | bigint | undefined;
1021
1193
  firstValidRound?: bigint | undefined;
1022
- lastValidRound?: bigint | undefined; /**
1023
- * Gets available deployUpdate methods
1024
- */
1194
+ lastValidRound?: bigint | undefined;
1025
1195
  appId: bigint;
1026
1196
  onComplete?: OnApplicationComplete.UpdateApplicationOC | undefined;
1027
1197
  args?: Uint8Array[] | undefined;
@@ -1087,6 +1257,17 @@ declare class AbelReaderClient {
1087
1257
  getAssetLabels: (params: CallParams<AbelReaderArgs['obj']['get_asset_labels(asset)string[]'] | AbelReaderArgs['tuple']['get_asset_labels(asset)string[]']> & {
1088
1258
  onComplete?: OnApplicationComplete.NoOpOC;
1089
1259
  }) => Promise<AppCallMethodCall>;
1260
+ /**
1261
+ * Makes a call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
1262
+ *
1263
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1264
+ *
1265
+ * @param params The params for the smart contract call
1266
+ * @returns The call params
1267
+ */
1268
+ getBlockTimesAndTc: (params: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & {
1269
+ onComplete?: OnApplicationComplete.NoOpOC;
1270
+ }) => Promise<AppCallMethodCall>;
1090
1271
  };
1091
1272
  /**
1092
1273
  * Create transactions for the current app
@@ -1168,6 +1349,21 @@ declare class AbelReaderClient {
1168
1349
  methodCalls: Map<number, import("algosdk").ABIMethod>;
1169
1350
  signers: Map<number, TransactionSigner>;
1170
1351
  }>;
1352
+ /**
1353
+ * Makes a call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
1354
+ *
1355
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1356
+ *
1357
+ * @param params The params for the smart contract call
1358
+ * @returns The call transaction
1359
+ */
1360
+ getBlockTimesAndTc: (params: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & {
1361
+ onComplete?: OnApplicationComplete.NoOpOC;
1362
+ }) => Promise<{
1363
+ transactions: Transaction[];
1364
+ methodCalls: Map<number, import("algosdk").ABIMethod>;
1365
+ signers: Map<number, TransactionSigner>;
1366
+ }>;
1171
1367
  };
1172
1368
  /**
1173
1369
  * Send calls to the current app
@@ -1293,6 +1489,26 @@ declare class AbelReaderClient {
1293
1489
  confirmation: modelsv2.PendingTransactionResponse;
1294
1490
  transaction: Transaction;
1295
1491
  }>;
1492
+ /**
1493
+ * Makes a call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
1494
+ *
1495
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1496
+ *
1497
+ * @param params The params for the smart contract call
1498
+ * @returns The call result
1499
+ */
1500
+ getBlockTimesAndTc: (params: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']> & SendParams & {
1501
+ onComplete?: OnApplicationComplete.NoOpOC;
1502
+ }) => Promise<{
1503
+ return: BlockTimeAndTc | undefined;
1504
+ returns?: ABIReturn[] | undefined;
1505
+ groupId: string;
1506
+ txIds: string[];
1507
+ confirmations: modelsv2.PendingTransactionResponse[];
1508
+ transactions: Transaction[];
1509
+ confirmation: modelsv2.PendingTransactionResponse;
1510
+ transaction: Transaction;
1511
+ }>;
1296
1512
  };
1297
1513
  /**
1298
1514
  * Clone this app client with different params
@@ -1328,6 +1544,15 @@ declare class AbelReaderClient {
1328
1544
  * @returns The call result
1329
1545
  */
1330
1546
  getAssetLabels(params: CallParams<AbelReaderArgs['obj']['get_asset_labels(asset)string[]'] | AbelReaderArgs['tuple']['get_asset_labels(asset)string[]']>): Promise<string[]>;
1547
+ /**
1548
+ * Makes a readonly (simulated) call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
1549
+ *
1550
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
1551
+ *
1552
+ * @param params The params for the smart contract call
1553
+ * @returns The call result
1554
+ */
1555
+ getBlockTimesAndTc(params: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']>): Promise<BlockTimeAndTc>;
1331
1556
  /**
1332
1557
  * Methods to access state for the current AbelReader app
1333
1558
  */
@@ -1359,6 +1584,14 @@ export type AbelReaderComposer<TReturns extends [...any[]] = []> = {
1359
1584
  * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions
1360
1585
  */
1361
1586
  getAssetLabels(params?: CallParams<AbelReaderArgs['obj']['get_asset_labels(asset)string[]'] | AbelReaderArgs['tuple']['get_asset_labels(asset)string[]']>): AbelReaderComposer<[...TReturns, AbelReaderReturns['get_asset_labels(asset)string[]'] | undefined]>;
1587
+ /**
1588
+ * Calls the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
1589
+ *
1590
+ * @param args The arguments for the contract call
1591
+ * @param params Any additional parameters for the call
1592
+ * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions
1593
+ */
1594
+ getBlockTimesAndTc(params?: CallParams<AbelReaderArgs['obj']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | AbelReaderArgs['tuple']['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)']>): AbelReaderComposer<[...TReturns, AbelReaderReturns['getBlockTimesAndTc(uint64,uint64)(uint32,uint64)'] | undefined]>;
1362
1595
  /**
1363
1596
  * Gets available update methods
1364
1597
  */
@@ -1459,10 +1692,15 @@ export declare class AbelReaderSDK extends GhostBase {
1459
1692
  extraMethodCallArgs?: ExtraMethodCallArgs | ExtraMethodCallArgs[];
1460
1693
  extraSimulateArgs?: RawSimulateOptions;
1461
1694
  }): Promise<Methods['getAssetsTiny']['returns'][]>;
1462
- get_asset_labels({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }: {
1695
+ getAssetLabels({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }: {
1463
1696
  methodArgsOrArgsArray: Methods['get_asset_labels']['argsObj'] | Methods['get_asset_labels']['argsObj'][];
1464
1697
  extraMethodCallArgs?: ExtraMethodCallArgs | ExtraMethodCallArgs[];
1465
1698
  extraSimulateArgs?: RawSimulateOptions;
1466
1699
  }): Promise<Methods['get_asset_labels']['returns'][]>;
1700
+ getBlockTimesAndTc({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }: {
1701
+ methodArgsOrArgsArray: Methods['getBlockTimesAndTc']['argsObj'] | Methods['getBlockTimesAndTc']['argsObj'][];
1702
+ extraMethodCallArgs?: ExtraMethodCallArgs | ExtraMethodCallArgs[];
1703
+ extraSimulateArgs?: RawSimulateOptions;
1704
+ }): Promise<Methods['getBlockTimesAndTc']['returns'][]>;
1467
1705
  }
1468
1706
  export {};
@@ -1,7 +1,7 @@
1
1
  import { getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56';
2
2
  import { AppClient as _AppClient, } from '@algorandfoundation/algokit-utils/types/app-client';
3
3
  import { AppFactory as _AppFactory } from '@algorandfoundation/algokit-utils/types/app-factory';
4
- export const APP_SPEC = { "name": "AbelReader", "structs": { "AssetTinyLabels": [{ "name": "name", "type": "string" }, { "name": "unitName", "type": "string" }, { "name": "decimals", "type": "uint8" }, { "name": "labels", "type": "string[]" }], "BalanceInfo": [{ "name": "balance", "type": "uint64" }, { "name": "minBalance", "type": "uint64" }] }, "methods": [{ "name": "getBalanceInfo", "args": [{ "type": "address[]", "name": "accounts" }], "returns": { "type": "(uint64,uint64)", "struct": "BalanceInfo" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getAssetsTiny", "args": [{ "type": "uint64[]", "name": "assetIds" }, { "type": "uint64", "name": "abelAppId" }], "returns": { "type": "(string,string,uint8,string[])", "struct": "AssetTinyLabels" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "get_asset_labels", "args": [{ "type": "asset", "name": "assetId" }], "returns": { "type": "string[]" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": ["DeleteApplication", "UpdateApplication"] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [332], "errorMessage": "Bytes has valid prefix" }, { "pc": [8], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [48], "errorMessage": "OnCompletion must be one of UpdateApplication, DeleteApplication && can only call when not creating" }, { "pc": [347, 354, 357], "errorMessage": "asset exists" }, { "pc": [108, 236], "errorMessage": "index access is out of bounds" }, { "pc": [77, 195], "errorMessage": "invalid array length header" }, { "pc": [89], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [207], "errorMessage": "invalid number of bytes for arc4.dynamic_array<asset>" }, { "pc": [215, 337], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [485], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [363], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMzIgVE1QTF9VUERBVEFCTEUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjMwCiAgICAvLyBleHBvcnQgY2xhc3MgQWJlbFJlYWRlciBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FkbWluT25seUAxMAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHB1c2hieXRlc3MgMHg0ODc3YTk2NyAweGQ1YWIzMzY2IDB4YzJlZDc0M2YgLy8gbWV0aG9kICJnZXRCYWxhbmNlSW5mbyhhZGRyZXNzW10pKHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJnZXRBc3NldHNUaW55KHVpbnQ2NFtdLHVpbnQ2NCkoc3RyaW5nLHN0cmluZyx1aW50OCxzdHJpbmdbXSkiLCBtZXRob2QgImdldF9hc3NldF9sYWJlbHMoYXNzZXQpc3RyaW5nW10iCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBnZXRCYWxhbmNlSW5mbyBnZXRBc3NldHNUaW55IGdldEFzc2V0TGFiZWxzCiAgICBlcnIKCm1haW5fYWRtaW5Pbmx5QDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbIlVwZGF0ZUFwcGxpY2F0aW9uIiwgIkRlbGV0ZUFwcGxpY2F0aW9uIl0gfSkKICAgIGludGNfMSAvLyAxCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzaGwKICAgIHB1c2hpbnQgNDggLy8gNDgKICAgICYKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIG9uZSBvZiBVcGRhdGVBcHBsaWNhdGlvbiwgRGVsZXRlQXBwbGljYXRpb24gJiYgY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGFzc2VydChUZW1wbGF0ZVZhcjx1aW50NjQ+KCJVUERBVEFCTEUiKSA9PT0gMSAmJiBUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MpOwogICAgaW50YyA0IC8vIFRNUExfVVBEQVRBQkxFCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IG1haW5fYm9vbF9mYWxzZUAxNAogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYnogbWFpbl9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MzEKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbIlVwZGF0ZUFwcGxpY2F0aW9uIiwgIkRlbGV0ZUFwcGxpY2F0aW9uIl0gfSkKICAgIHJldHVybgoKbWFpbl9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjMxCiAgICAvLyBAYmFyZW1ldGhvZCh7IGFsbG93QWN0aW9uczogWyJVcGRhdGVBcHBsaWNhdGlvbiIsICJEZWxldGVBcHBsaWNhdGlvbiJdIH0pCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo6QWJlbFJlYWRlci5nZXRCYWxhbmNlSW5mb1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEJhbGFuY2VJbmZvOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MzYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSwgb25DcmVhdGU6ICJhbGxvdyIgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YWNjb3VudD4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjM4CiAgICAvLyBmb3IgKGxldCBpZHg6IHVpbnQ2NCA9IDA7IGlkeCA8IGFjY291bnRzLmxlbmd0aDsgaWR4KyspIHsKICAgIGludGNfMCAvLyAwCgpnZXRCYWxhbmNlSW5mb193aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjM4CiAgICAvLyBmb3IgKGxldCBpZHg6IHVpbnQ2NCA9IDA7IGlkeCA8IGFjY291bnRzLmxlbmd0aDsgaWR4KyspIHsKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IGdldEJhbGFuY2VJbmZvX2FmdGVyX3doaWxlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBjb25zdCBhY2NvdW50ID0gYWNjb3VudHNbaWR4XTsKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMyAvLyAzMgogICAgKgogICAgaW50Y18zIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0MAogICAgLy8gY29uc3QgYmFsYW5jZSA9IG9wLmJhbGFuY2UoYWNjb3VudCk7CiAgICBiYWxhbmNlCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIGlmIChiYWxhbmNlID4gMCkgewogICAgYnogZ2V0QmFsYW5jZUluZm9fZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyBjb25zdCBtaW5CYWxhbmNlID0gb3AubWluQmFsYW5jZShhY2NvdW50KTsKICAgIGRpZyA0CiAgICBtaW5fYmFsYW5jZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGNvbnN0IGJhbGFuY2VJbmZvOiBCYWxhbmNlSW5mbyA9IHsgYmFsYW5jZSwgbWluQmFsYW5jZSB9OwogICAgZGlnIDQKICAgIGl0b2IKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGxvZyhlbmNvZGVBcmM0KGJhbGFuY2VJbmZvKSk7CiAgICBsb2cKCmdldEJhbGFuY2VJbmZvX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjM4CiAgICAvLyBmb3IgKGxldCBpZHg6IHVpbnQ2NCA9IDA7IGlkeCA8IGFjY291bnRzLmxlbmd0aDsgaWR4KyspIHsKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBnZXRCYWxhbmNlSW5mb193aGlsZV90b3BAMgoKZ2V0QmFsYW5jZUluZm9fZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo1MwogICAgLy8gcmV0dXJuIHsgYmFsYW5jZTogMCwgbWluQmFsYW5jZTogMCB9OwogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBsb2coZW5jb2RlQXJjNCh0aGlzLmdldEVtcHR5QmFsYW5jZUluZm8oKSkpOwogICAgbG9nCiAgICBiIGdldEJhbGFuY2VJbmZvX2FmdGVyX2lmX2Vsc2VANgoKZ2V0QmFsYW5jZUluZm9fYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjM2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUsIG9uQ3JlYXRlOiAiYWxsb3ciIH0pCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo6QWJlbFJlYWRlci5nZXRBc3NldHNUaW55W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0QXNzZXRzVGlueToKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDMKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSwgb25DcmVhdGU6ICJhbGxvdyIgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhc3NldD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjU4CiAgICAvLyBmb3IgKGxldCBpZHg6IHVpbnQ2NCA9IDA7IGlkeCA8IGFzc2V0SWRzLmxlbmd0aDsgaWR4KyspIHsKICAgIGludGNfMCAvLyAwCgpnZXRBc3NldHNUaW55X3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYXNzZXRJZHMubGVuZ3RoOyBpZHgrKykgewogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogZ2V0QXNzZXRzVGlueV9hZnRlcl93aGlsZUAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NTkKICAgIC8vIGNvbnN0IGFzc2V0ID0gYXNzZXRJZHNbaWR4XTsKICAgIGRpZyAzCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBkdXAyCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidXJ5IDExCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjYwCiAgICAvLyBjb25zdCBbXywgZXhpc3RzXSA9IG9wLkFzc2V0UGFyYW1zLmFzc2V0Q3JlYXRvcihhc3NldC5pZCk7CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q3JlYXRvcgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2MQogICAgLy8gaWYgKCFleGlzdHMpIHsKICAgIGJueiBnZXRBc3NldHNUaW55X2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo4NS05MAogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgbmFtZTogIiIsCiAgICAvLyAgIHVuaXRfbmFtZTogIiIsCiAgICAvLyAgIGRlY2ltYWxzOiBuZXcgVWludDgoMCksCiAgICAvLyAgIGxhYmVsczogW10sCiAgICAvLyB9OwogICAgcHVzaGJ5dGVzIDB4MDAwNzAwMDkwMDAwMGIwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjYyCiAgICAvLyBsb2coZW5jb2RlQXJjNCh0aGlzLmdldEVtcHR5QXNzZXRUaW55TGFiZWxzKCkpKTsKICAgIGxvZwoKZ2V0QXNzZXRzVGlueV9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NTgKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYXNzZXRJZHMubGVuZ3RoOyBpZHgrKykgewogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGdldEFzc2V0c1Rpbnlfd2hpbGVfdG9wQDIKCmdldEFzc2V0c1RpbnlfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gYWJlbEFwcElkICE9PSAwID8gY29tcGlsZUFyYzQoQWJlbFN0dWIpLmNhbGwuaGFzX2Fzc2V0X2xhYmVsKHsgYXBwSWQ6IGFiZWxBcHBJZCwgYXJnczogW2Fzc2V0LmlkLCAicHYiXSB9KS5yZXR1cm5WYWx1ZSA6IDA7CiAgICBkaWcgMQogICAgYnogZ2V0QXNzZXRzVGlueV90ZXJuYXJ5X2ZhbHNlQDgKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hieXRlcyAweDk3ZjQwYThhIC8vIG1ldGhvZCAiaGFzX2Fzc2V0X2xhYmVsKHVpbnQ2NCxzdHJpbmcpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwMjcwNzYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCgpnZXRBc3NldHNUaW55X3Rlcm5hcnlfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjY3CiAgICAvLyBuYW1lOiBhc3NldC5uYW1lLnRvU3RyaW5nKCksCiAgICBkaWcgNQogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgc3dhcAogICAgYnVyeSAxMAogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIHVuaXRfbmFtZTogYXNzZXQudW5pdE5hbWUudG9TdHJpbmcoKSwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBzd2FwCiAgICBidXJ5IDkKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBkZWNpbWFsczogbmV3IFVpbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo3MAogICAgLy8gbGFiZWxzOiBwdiA9PT0gMCA/IChbXSBhcyBzdHJpbmdbXSkgOiBbInB2Il0sCiAgICBibnogZ2V0QXNzZXRzVGlueV90ZXJuYXJ5X2ZhbHNlQDExCiAgICBwdXNoYnl0ZXMgMHgwMDAwCgpnZXRBc3NldHNUaW55X3Rlcm5hcnlfbWVyZ2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2Ni03MQogICAgLy8gY29uc3QgYXNzZXRJbmZvOiBBc3NldFRpbnlMYWJlbHMgPSB7CiAgICAvLyAgIG5hbWU6IGFzc2V0Lm5hbWUudG9TdHJpbmcoKSwKICAgIC8vICAgdW5pdF9uYW1lOiBhc3NldC51bml0TmFtZS50b1N0cmluZygpLAogICAgLy8gICBkZWNpbWFsczogbmV3IFVpbnQ4KGFzc2V0LmRlY2ltYWxzKSwKICAgIC8vICAgbGFiZWxzOiBwdiA9PT0gMCA/IChbXSBhcyBzdHJpbmdbXSkgOiBbInB2Il0sCiAgICAvLyB9OwogICAgZGlnIDcKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA3IC8vIDcKICAgICsKICAgIGRpZyA4CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDA3CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgKwogICAgc3dhcAogICAgZGlnIDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIGxvZyhlbmNvZGVBcmM0KGFzc2V0SW5mbykpOwogICAgbG9nCiAgICBiIGdldEFzc2V0c1RpbnlfYWZ0ZXJfaWZfZWxzZUAxMwoKZ2V0QXNzZXRzVGlueV90ZXJuYXJ5X2ZhbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NzAKICAgIC8vIGxhYmVsczogcHYgPT09IDAgPyAoW10gYXMgc3RyaW5nW10pIDogWyJwdiJdLAogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIwMDAyNzA3NgogICAgYiBnZXRBc3NldHNUaW55X3Rlcm5hcnlfbWVyZ2VAMTIKCmdldEFzc2V0c1RpbnlfdGVybmFyeV9mYWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIGFiZWxBcHBJZCAhPT0gMCA/IGNvbXBpbGVBcmM0KEFiZWxTdHViKS5jYWxsLmhhc19hc3NldF9sYWJlbCh7IGFwcElkOiBhYmVsQXBwSWQsIGFyZ3M6IFthc3NldC5pZCwgInB2Il0gfSkucmV0dXJuVmFsdWUgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgZ2V0QXNzZXRzVGlueV90ZXJuYXJ5X21lcmdlQDkKCmdldEFzc2V0c1RpbnlfYWZ0ZXJfd2hpbGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo1NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlLCBvbkNyZWF0ZTogImFsbG93IiB9KQogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDA3MDAwOTAwMDAwYjAwMDAwMDAwMDAwMAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6OkFiZWxSZWFkZXIuZ2V0QXNzZXRMYWJlbHNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRBc3NldExhYmVsczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjc4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUsIG9uQ3JlYXRlOiAiYWxsb3ciLCBuYW1lOiAiZ2V0X2Fzc2V0X2xhYmVscyIsIHJlc291cmNlRW5jb2Rpbmc6ICJpbmRleCIgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAEIIAAxG0EAITEZFESCAwRId6lnBNWrM2YEwu10PzYaAI4DAB8AkwG6ACMxGZCBMBoxGBBEIQQjEkEACjEAMgkSQQACI0MiQyKAADYaAUcCIllJTgIlC4ECCEwVEkQiSUsCDEEAPUsCVwIASwElCyVYSUUGYElFBUEAEksEeEsEFkwWULBJIwhFAUL/0oAQAAAAAAAAAAAAAAAAAAAAALBC/+KAFBUffHUAAAAAAAAAAAAAAAAAAAAAsCNDIkcDgAA2GgFHAiJZSU4CJAuBAghMFRJENhoCSRUkEkQXIklLAwxBAOhLA1cCAEsBJAtKJFhFC1tJRQZxC0UBQAAYgA0ABwAJAAALAAAAAAAAsEkjCEUBQv/ISwFBAK6xgASX9AqKshpLCLIagAQAAnB2shoishlLAbIYgQayECKyAbO0PklXBABMVwAEgAQVH3x1EkRJFSQSRBdLBUlxBExFCkRJcQNMRQlEcQFEFkmTJA5EVwcBRQlAAESAAgAASwdJFRZXBgJMUEkVgQcISwhJFRZXBgJMUEsBFlcGAoACAAdMUEsBFU8DCExLDFBMFlcGAlBPAlBMUExQsEL/UoAIAAEAAgACcHZC/7MiQv+KgBEVH3x1AAcACQAACwAAAAAAALAjQzYaARUjEkSABhUffHUAALAjQw==", "clear": "C4EBQw==" }, "events": [], "templateVariables": { "UPDATABLE": { "type": "AVMUint64" } } };
4
+ export const APP_SPEC = { "name": "AbelReader", "structs": { "AssetTinyLabels": [{ "name": "name", "type": "string" }, { "name": "unitName", "type": "string" }, { "name": "decimals", "type": "uint8" }, { "name": "labels", "type": "string[]" }], "BalanceInfo": [{ "name": "balance", "type": "uint64" }, { "name": "minBalance", "type": "uint64" }], "BlockTimeAndTc": [{ "name": "ts", "type": "uint32" }, { "name": "tc", "type": "uint64" }] }, "methods": [{ "name": "getBalanceInfo", "args": [{ "type": "address[]", "name": "accounts" }], "returns": { "type": "(uint64,uint64)", "struct": "BalanceInfo" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getAssetsTiny", "args": [{ "type": "uint64[]", "name": "assetIds" }, { "type": "uint64", "name": "abelAppId" }], "returns": { "type": "(string,string,uint8,string[])", "struct": "AssetTinyLabels" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "get_asset_labels", "args": [{ "type": "asset", "name": "assetId" }], "returns": { "type": "string[]" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getBlockTimesAndTc", "args": [{ "type": "uint64", "name": "firstRound" }, { "type": "uint64", "name": "lastRound" }], "returns": { "type": "(uint32,uint64)", "struct": "BlockTimeAndTc" }, "actions": { "create": ["NoOp"], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": ["DeleteApplication", "UpdateApplication"] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [339], "errorMessage": "Bytes has valid prefix" }, { "pc": [8], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [55], "errorMessage": "OnCompletion must be one of UpdateApplication, DeleteApplication && can only call when not creating" }, { "pc": [354, 361, 364], "errorMessage": "asset exists" }, { "pc": [115, 243], "errorMessage": "index access is out of bounds" }, { "pc": [84, 202], "errorMessage": "invalid array length header" }, { "pc": [96], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [214], "errorMessage": "invalid number of bytes for arc4.dynamic_array<asset>" }, { "pc": [222, 344, 511, 520], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [492], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [370, 539], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwIDggMzIgVE1QTF9VUERBVEFCTEUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjM1CiAgICAvLyBleHBvcnQgY2xhc3MgQWJlbFJlYWRlciBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2FkbWluT25seUAxMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHB1c2hieXRlc3MgMHg0ODc3YTk2NyAweGQ1YWIzMzY2IDB4YzJlZDc0M2YgMHhhNzBlNjJhMCAvLyBtZXRob2QgImdldEJhbGFuY2VJbmZvKGFkZHJlc3NbXSkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImdldEFzc2V0c1RpbnkodWludDY0W10sdWludDY0KShzdHJpbmcsc3RyaW5nLHVpbnQ4LHN0cmluZ1tdKSIsIG1ldGhvZCAiZ2V0X2Fzc2V0X2xhYmVscyhhc3NldClzdHJpbmdbXSIsIG1ldGhvZCAiZ2V0QmxvY2tUaW1lc0FuZFRjKHVpbnQ2NCx1aW50NjQpKHVpbnQzMix1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggZ2V0QmFsYW5jZUluZm8gZ2V0QXNzZXRzVGlueSBnZXRBc3NldExhYmVscyBnZXRCbG9ja1RpbWVzQW5kVGMKICAgIGVycgoKbWFpbl9hZG1pbk9ubHlAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czozNgogICAgLy8gQGJhcmVtZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsiVXBkYXRlQXBwbGljYXRpb24iLCAiRGVsZXRlQXBwbGljYXRpb24iXSB9KQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCA0OCAvLyA0OAogICAgJgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgb25lIG9mIFVwZGF0ZUFwcGxpY2F0aW9uLCBEZWxldGVBcHBsaWNhdGlvbiAmJiBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czozOAogICAgLy8gYXNzZXJ0KFRlbXBsYXRlVmFyPHVpbnQ2ND4oIlVQREFUQUJMRSIpID09PSAxICYmIFR4bi5zZW5kZXIgPT09IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyk7CiAgICBpbnRjIDQgLy8gVE1QTF9VUERBVEFCTEUKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYnogbWFpbl9ib29sX2ZhbHNlQDE1CiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBieiBtYWluX2Jvb2xfZmFsc2VAMTUKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czozNgogICAgLy8gQGJhcmVtZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsiVXBkYXRlQXBwbGljYXRpb24iLCAiRGVsZXRlQXBwbGljYXRpb24iXSB9KQogICAgcmV0dXJuCgptYWluX2Jvb2xfZmFsc2VAMTU6CiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MzYKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbIlVwZGF0ZUFwcGxpY2F0aW9uIiwgIkRlbGV0ZUFwcGxpY2F0aW9uIl0gfSkKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjpBYmVsUmVhZGVyLmdldEJhbGFuY2VJbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0QmFsYW5jZUluZm86CiAgICBpbnRjXzEgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlLCBvbkNyZWF0ZTogImFsbG93IiB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhY2NvdW50PgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYWNjb3VudHMubGVuZ3RoOyBpZHgrKykgewogICAgaW50Y18xIC8vIDAKCmdldEJhbGFuY2VJbmZvX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYWNjb3VudHMubGVuZ3RoOyBpZHgrKykgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogZ2V0QmFsYW5jZUluZm9fYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIGNvbnN0IGFjY291bnQgPSBhY2NvdW50c1tpZHhdOwogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBjb25zdCBiYWxhbmNlID0gb3AuYmFsYW5jZShhY2NvdW50KTsKICAgIGJhbGFuY2UKICAgIGR1cAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0NgogICAgLy8gaWYgKGJhbGFuY2UgPiAwKSB7CiAgICBieiBnZXRCYWxhbmNlSW5mb19lbHNlX2JvZHlANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDcKICAgIC8vIGNvbnN0IG1pbkJhbGFuY2UgPSBvcC5taW5CYWxhbmNlKGFjY291bnQpOwogICAgZGlnIDQKICAgIG1pbl9iYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0OAogICAgLy8gY29uc3QgYmFsYW5jZUluZm86IEJhbGFuY2VJbmZvID0geyBiYWxhbmNlLCBtaW5CYWxhbmNlIH07CiAgICBkaWcgNAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo0OQogICAgLy8gbG9nKGVuY29kZUFyYzQoYmFsYW5jZUluZm8pKTsKICAgIGxvZwoKZ2V0QmFsYW5jZUluZm9fYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDMKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYWNjb3VudHMubGVuZ3RoOyBpZHgrKykgewogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGdldEJhbGFuY2VJbmZvX3doaWxlX3RvcEAyCgpnZXRCYWxhbmNlSW5mb19lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjU4CiAgICAvLyByZXR1cm4geyBiYWxhbmNlOiAwLCBtaW5CYWxhbmNlOiAwIH07CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIGxvZyhlbmNvZGVBcmM0KHRoaXMuZ2V0RW1wdHlCYWxhbmNlSW5mbygpKSk7CiAgICBsb2cKICAgIGIgZ2V0QmFsYW5jZUluZm9fYWZ0ZXJfaWZfZWxzZUA2CgpnZXRCYWxhbmNlSW5mb19hZnRlcl93aGlsZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSwgb25DcmVhdGU6ICJhbGxvdyIgfSkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjpBYmVsUmVhZGVyLmdldEFzc2V0c1Rpbnlbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRBc3NldHNUaW55OgogICAgaW50Y18xIC8vIDAKICAgIGR1cG4gMwogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlLCBvbkNyZWF0ZTogImFsbG93IiB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFzc2V0PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIGZvciAobGV0IGlkeDogdWludDY0ID0gMDsgaWR4IDwgYXNzZXRJZHMubGVuZ3RoOyBpZHgrKykgewogICAgaW50Y18xIC8vIDAKCmdldEFzc2V0c1Rpbnlfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2MwogICAgLy8gZm9yIChsZXQgaWR4OiB1aW50NjQgPSAwOyBpZHggPCBhc3NldElkcy5sZW5ndGg7IGlkeCsrKSB7CiAgICBkdXAKICAgIGRpZyAzCiAgICA8CiAgICBieiBnZXRBc3NldHNUaW55X2FmdGVyX3doaWxlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2NAogICAgLy8gY29uc3QgYXNzZXQgPSBhc3NldElkc1tpZHhdOwogICAgZGlnIDMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgICoKICAgIGR1cDIKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ1cnkgMTEKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIGNvbnN0IFtfLCBleGlzdHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXRDcmVhdG9yKGFzc2V0LmlkKTsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjY2CiAgICAvLyBpZiAoIWV4aXN0cykgewogICAgYm56IGdldEFzc2V0c1RpbnlfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjkwLTk1CiAgICAvLyByZXR1cm4gewogICAgLy8gICBuYW1lOiAiIiwKICAgIC8vICAgdW5pdF9uYW1lOiAiIiwKICAgIC8vICAgZGVjaW1hbHM6IG5ldyBVaW50OCgwKSwKICAgIC8vICAgbGFiZWxzOiBbXSwKICAgIC8vIH07CiAgICBwdXNoYnl0ZXMgMHgwMDA3MDAwOTAwMDAwYjAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NjcKICAgIC8vIGxvZyhlbmNvZGVBcmM0KHRoaXMuZ2V0RW1wdHlBc3NldFRpbnlMYWJlbHMoKSkpOwogICAgbG9nCgpnZXRBc3NldHNUaW55X2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo2MwogICAgLy8gZm9yIChsZXQgaWR4OiB1aW50NjQgPSAwOyBpZHggPCBhc3NldElkcy5sZW5ndGg7IGlkeCsrKSB7CiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgZ2V0QXNzZXRzVGlueV93aGlsZV90b3BAMgoKZ2V0QXNzZXRzVGlueV9lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjcwCiAgICAvLyBhYmVsQXBwSWQgIT09IDAgPyBjb21waWxlQXJjNChBYmVsU3R1YikuY2FsbC5oYXNfYXNzZXRfbGFiZWwoeyBhcHBJZDogYWJlbEFwcElkLCBhcmdzOiBbYXNzZXQuaWQsICJwdiJdIH0pLnJldHVyblZhbHVlIDogMDsKICAgIGRpZyAxCiAgICBieiBnZXRBc3NldHNUaW55X3Rlcm5hcnlfZmFsc2VAOAogICAgaXR4bl9iZWdpbgogICAgcHVzaGJ5dGVzIDB4OTdmNDBhOGEgLy8gbWV0aG9kICJoYXNfYXNzZXRfbGFiZWwodWludDY0LHN0cmluZyl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDgKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDAyNzA3NgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKCmdldEFzc2V0c1RpbnlfdGVybmFyeV9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NzIKICAgIC8vIG5hbWU6IGFzc2V0Lm5hbWUudG9TdHJpbmcoKSwKICAgIGRpZyA1CiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBzd2FwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo3MwogICAgLy8gdW5pdF9uYW1lOiBhc3NldC51bml0TmFtZS50b1N0cmluZygpLAogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VW5pdE5hbWUKICAgIHN3YXAKICAgIGJ1cnkgOQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIGRlY2ltYWxzOiBuZXcgVWludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBsYWJlbHM6IHB2ID09PSAwID8gKFtdIGFzIHN0cmluZ1tdKSA6IFsicHYiXSwKICAgIGJueiBnZXRBc3NldHNUaW55X3Rlcm5hcnlfZmFsc2VAMTEKICAgIHB1c2hieXRlcyAweDAwMDAKCmdldEFzc2V0c1RpbnlfdGVybmFyeV9tZXJnZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjcxLTc2CiAgICAvLyBjb25zdCBhc3NldEluZm86IEFzc2V0VGlueUxhYmVscyA9IHsKICAgIC8vICAgbmFtZTogYXNzZXQubmFtZS50b1N0cmluZygpLAogICAgLy8gICB1bml0X25hbWU6IGFzc2V0LnVuaXROYW1lLnRvU3RyaW5nKCksCiAgICAvLyAgIGRlY2ltYWxzOiBuZXcgVWludDgoYXNzZXQuZGVjaW1hbHMpLAogICAgLy8gICBsYWJlbHM6IHB2ID09PSAwID8gKFtdIGFzIHN0cmluZ1tdKSA6IFsicHYiXSwKICAgIC8vIH07CiAgICBkaWcgNwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDcgLy8gNwogICAgKwogICAgZGlnIDgKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwMDcKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICArCiAgICBzd2FwCiAgICBkaWcgMTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo3NwogICAgLy8gbG9nKGVuY29kZUFyYzQoYXNzZXRJbmZvKSk7CiAgICBsb2cKICAgIGIgZ2V0QXNzZXRzVGlueV9hZnRlcl9pZl9lbHNlQDEzCgpnZXRBc3NldHNUaW55X3Rlcm5hcnlfZmFsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gbGFiZWxzOiBwdiA9PT0gMCA/IChbXSBhcyBzdHJpbmdbXSkgOiBbInB2Il0sCiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMjAwMDI3MDc2CiAgICBiIGdldEFzc2V0c1RpbnlfdGVybmFyeV9tZXJnZUAxMgoKZ2V0QXNzZXRzVGlueV90ZXJuYXJ5X2ZhbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo3MAogICAgLy8gYWJlbEFwcElkICE9PSAwID8gY29tcGlsZUFyYzQoQWJlbFN0dWIpLmNhbGwuaGFzX2Fzc2V0X2xhYmVsKHsgYXBwSWQ6IGFiZWxBcHBJZCwgYXJnczogW2Fzc2V0LmlkLCAicHYiXSB9KS5yZXR1cm5WYWx1ZSA6IDA7CiAgICBpbnRjXzEgLy8gMAogICAgYiBnZXRBc3NldHNUaW55X3Rlcm5hcnlfbWVyZ2VAOQoKZ2V0QXNzZXRzVGlueV9hZnRlcl93aGlsZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjYxCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUsIG9uQ3JlYXRlOiAiYWxsb3ciIH0pCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTAwMDcwMDA5MDAwMDBiMDAwMDAwMDAwMDAwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo6QWJlbFJlYWRlci5nZXRBc3NldExhYmVsc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEFzc2V0TGFiZWxzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6ODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSwgb25DcmVhdGU6ICJhbGxvdyIsIG5hbWU6ICJnZXRfYXNzZXRfbGFiZWxzIiwgcmVzb3VyY2VFbmNvZGluZzogImluZGV4IiB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUwMDAwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo6QWJlbFJlYWRlci5nZXRCbG9ja1RpbWVzQW5kVGNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRCbG9ja1RpbWVzQW5kVGM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWJlbF9yZWFkZXIvY29udHJhY3QuYWxnby50czo5OAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlLCBvbkNyZWF0ZTogImFsbG93IiB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAoKZ2V0QmxvY2tUaW1lc0FuZFRjX3doaWxlX3RvcEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MTAwCiAgICAvLyBmb3IgKGxldCByb3VuZDogdWludDY0ID0gZmlyc3RSb3VuZDsgcm91bmQgPD0gbGFzdFJvdW5kOyByb3VuZCsrKSB7CiAgICBkdXAKICAgIGRpZyAyCiAgICA8PQogICAgYnogZ2V0QmxvY2tUaW1lc0FuZFRjX2FmdGVyX3doaWxlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gdHM6IG5ldyBVaW50MzIob3AuQmxvY2suYmxrVGltZXN0YW1wKHJvdW5kKSksCiAgICBkdXBuIDIKICAgIGJsb2NrIEJsa1RpbWVzdGFtcAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMyAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA0IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEwMwogICAgLy8gdGM6IG9wLkJsb2NrLmJsa1R4bkNvdW50ZXIocm91bmQpLAogICAgZGlnIDEKICAgIGJsb2NrIEJsa1R4bkNvdW50ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEwMS0xMDQKICAgIC8vIGNvbnN0IGJsa0RhdGE6IEJsb2NrVGltZUFuZFRjID0gewogICAgLy8gICB0czogbmV3IFVpbnQzMihvcC5CbG9jay5ibGtUaW1lc3RhbXAocm91bmQpKSwKICAgIC8vICAgdGM6IG9wLkJsb2NrLmJsa1R4bkNvdW50ZXIocm91bmQpLAogICAgLy8gfTsKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6MTA1CiAgICAvLyBsb2coZW5jb2RlQXJjNChibGtEYXRhKSk7CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hYmVsX3JlYWRlci9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gZm9yIChsZXQgcm91bmQ6IHVpbnQ2NCA9IGZpcnN0Um91bmQ7IHJvdW5kIDw9IGxhc3RSb3VuZDsgcm91bmQrKykgewogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBnZXRCbG9ja1RpbWVzQW5kVGNfd2hpbGVfdG9wQDIKCmdldEJsb2NrVGltZXNBbmRUY19hZnRlcl93aGlsZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FiZWxfcmVhZGVyL2NvbnRyYWN0LmFsZ28udHM6OTgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSwgb25DcmVhdGU6ICJhbGxvdyIgfSkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAQAIIAAxG0EAKDEZFESCBARId6lnBNWrM2YEwu10PwSnDmKgNhoAjgQAHwCTAboBzAAiMRmQgTAaMRgQRCEEIhJBAAoxADIJEkEAAiJDI0MjgAA2GgFHAiNZSU4CJQuBAghMFRJEI0lLAgxBAD1LAlcCAEsBJQslWElFBmBJRQVBABJLBHhLBBZMFlCwSSIIRQFC/9KAEAAAAAAAAAAAAAAAAAAAAACwQv/igBQVH3x1AAAAAAAAAAAAAAAAAAAAALAiQyNHA4AANhoBRwIjWUlOAiQLgQIITBUSRDYaAkkVJBJEFyNJSwMMQQDoSwNXAgBLASQLSiRYRQtbSUUGcQtFAUAAGIANAAcACQAACwAAAAAAALBJIghFAUL/yEsBQQCusYAEl/QKirIaSwiyGoAEAAJwdrIaI7IZSwGyGIEGshAjsgGztD5JVwQATFcABIAEFR98dRJESRUkEkQXSwVJcQRMRQpESXEDTEUJRHEBRBZJkyQORFcHAUUJQABEgAIAAEsHSRUWVwYCTFBJFYEHCEsISRUWVwYCTFBLARZXBgKAAgAHTFBLARVPAwhMSwxQTBZXBgJQTwJQTFBMULBC/1KACAABAAIAAnB2Qv+zI0L/ioARFR98dQAHAAkAAAsAAAAAAACwIkM2GgEVIhJEgAYVH3x1AACwIkM2GgFJFSQSRBc2GgJJFSQSRBdMSUsCDkEAG0cC0QEWSZMlDkRXBARLAdEIFlCwIghFAUL/3oAQFR98dQAAAAAAAAAAAAAAALAiQw==", "clear": "C4EBQw==" }, "events": [], "templateVariables": { "UPDATABLE": { "type": "AVMUint64" } } };
5
5
  class BinaryStateValue {
6
6
  value;
7
7
  constructor(value) {
@@ -26,6 +26,12 @@ export function AssetTinyLabelsFromTuple(abiTuple) {
26
26
  export function BalanceInfoFromTuple(abiTuple) {
27
27
  return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.BalanceInfo, APP_SPEC.structs);
28
28
  }
29
+ /**
30
+ * Converts the ABI tuple representation of a BlockTimeAndTc to the struct representation
31
+ */
32
+ export function BlockTimeAndTcFromTuple(abiTuple) {
33
+ return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.BlockTimeAndTc, APP_SPEC.structs);
34
+ }
29
35
  /**
30
36
  * Exposes methods for constructing `AppClient` params objects for ABI calls to the AbelReader smart contract
31
37
  */
@@ -46,6 +52,9 @@ export class AbelReaderParamsFactory {
46
52
  case 'get_asset_labels':
47
53
  case 'get_asset_labels(asset)string[]':
48
54
  return AbelReaderParamsFactory.create.getAssetLabels(params);
55
+ case 'getBlockTimesAndTc':
56
+ case 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)':
57
+ return AbelReaderParamsFactory.create.getBlockTimesAndTc(params);
49
58
  }
50
59
  throw new Error(`Unknown ' + verb + ' method`);
51
60
  },
@@ -88,6 +97,19 @@ export class AbelReaderParamsFactory {
88
97
  args: Array.isArray(params.args) ? params.args : [params.args.assetId],
89
98
  };
90
99
  },
100
+ /**
101
+ * Constructs create ABI call params for the AbelReader smart contract using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method
102
+ *
103
+ * @param params Parameters for the call
104
+ * @returns An `AppClientMethodCallParams` object for the call
105
+ */
106
+ getBlockTimesAndTc(params) {
107
+ return {
108
+ ...params,
109
+ method: 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)',
110
+ args: Array.isArray(params.args) ? params.args : [params.args.firstRound, params.args.lastRound],
111
+ };
112
+ },
91
113
  };
92
114
  }
93
115
  /**
@@ -129,6 +151,19 @@ export class AbelReaderParamsFactory {
129
151
  args: Array.isArray(params.args) ? params.args : [params.args.assetId],
130
152
  };
131
153
  }
154
+ /**
155
+ * Constructs a no op call for the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method
156
+ *
157
+ * @param params Parameters for the call
158
+ * @returns An `AppClientMethodCallParams` object for the call
159
+ */
160
+ static getBlockTimesAndTc(params) {
161
+ return {
162
+ ...params,
163
+ method: 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)',
164
+ args: Array.isArray(params.args) ? params.args : [params.args.firstRound, params.args.lastRound],
165
+ };
166
+ }
132
167
  }
133
168
  /**
134
169
  * A factory to create and deploy one or more instance of the AbelReader smart contract and to create one or more app clients to interact with those (or other) app instances
@@ -232,6 +267,15 @@ class AbelReaderFactory {
232
267
  getAssetLabels: (params) => {
233
268
  return this.appFactory.params.create(AbelReaderParamsFactory.create.getAssetLabels(params));
234
269
  },
270
+ /**
271
+ * Creates a new instance of the AbelReader smart contract using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
272
+ *
273
+ * @param params The params for the smart contract call
274
+ * @returns The create params
275
+ */
276
+ getBlockTimesAndTc: (params) => {
277
+ return this.appFactory.params.create(AbelReaderParamsFactory.create.getBlockTimesAndTc(params));
278
+ },
235
279
  },
236
280
  /**
237
281
  * Gets available deployUpdate methods
@@ -297,6 +341,15 @@ class AbelReaderFactory {
297
341
  getAssetLabels: (params) => {
298
342
  return this.appFactory.createTransaction.create(AbelReaderParamsFactory.create.getAssetLabels(params));
299
343
  },
344
+ /**
345
+ * Creates a new instance of the AbelReader smart contract using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
346
+ *
347
+ * @param params The params for the smart contract call
348
+ * @returns The create transaction
349
+ */
350
+ getBlockTimesAndTc: (params) => {
351
+ return this.appFactory.createTransaction.create(AbelReaderParamsFactory.create.getBlockTimesAndTc(params));
352
+ },
300
353
  },
301
354
  };
302
355
  /**
@@ -337,6 +390,16 @@ class AbelReaderFactory {
337
390
  const result = await this.appFactory.send.create(AbelReaderParamsFactory.create.getAssetLabels(params));
338
391
  return { result: { ...result.result, return: result.result.return }, appClient: new AbelReaderClient(result.appClient) };
339
392
  },
393
+ /**
394
+ * Creates a new instance of the AbelReader smart contract using an ABI method call using the getBlockTimesAndTc(uint64,uint64)(uint32,uint64) ABI method.
395
+ *
396
+ * @param params The params for the smart contract call
397
+ * @returns The create result
398
+ */
399
+ getBlockTimesAndTc: async (params) => {
400
+ const result = await this.appFactory.send.create(AbelReaderParamsFactory.create.getBlockTimesAndTc(params));
401
+ return { result: { ...result.result, return: result.result.return }, appClient: new AbelReaderClient(result.appClient) };
402
+ },
340
403
  },
341
404
  };
342
405
  }
@@ -473,6 +536,17 @@ class AbelReaderClient {
473
536
  getAssetLabels: (params) => {
474
537
  return this.appClient.params.call(AbelReaderParamsFactory.getAssetLabels(params));
475
538
  },
539
+ /**
540
+ * Makes a call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
541
+ *
542
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
543
+ *
544
+ * @param params The params for the smart contract call
545
+ * @returns The call params
546
+ */
547
+ getBlockTimesAndTc: (params) => {
548
+ return this.appClient.params.call(AbelReaderParamsFactory.getBlockTimesAndTc(params));
549
+ },
476
550
  };
477
551
  /**
478
552
  * Create transactions for the current app
@@ -548,6 +622,17 @@ class AbelReaderClient {
548
622
  getAssetLabels: (params) => {
549
623
  return this.appClient.createTransaction.call(AbelReaderParamsFactory.getAssetLabels(params));
550
624
  },
625
+ /**
626
+ * Makes a call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
627
+ *
628
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
629
+ *
630
+ * @param params The params for the smart contract call
631
+ * @returns The call transaction
632
+ */
633
+ getBlockTimesAndTc: (params) => {
634
+ return this.appClient.createTransaction.call(AbelReaderParamsFactory.getBlockTimesAndTc(params));
635
+ },
551
636
  };
552
637
  /**
553
638
  * Send calls to the current app
@@ -626,6 +711,18 @@ class AbelReaderClient {
626
711
  const result = await this.appClient.send.call(AbelReaderParamsFactory.getAssetLabels(params));
627
712
  return { ...result, return: result.return };
628
713
  },
714
+ /**
715
+ * Makes a call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
716
+ *
717
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
718
+ *
719
+ * @param params The params for the smart contract call
720
+ * @returns The call result
721
+ */
722
+ getBlockTimesAndTc: async (params) => {
723
+ const result = await this.appClient.send.call(AbelReaderParamsFactory.getBlockTimesAndTc(params));
724
+ return { ...result, return: result.return };
725
+ },
629
726
  };
630
727
  /**
631
728
  * Clone this app client with different params
@@ -672,6 +769,18 @@ class AbelReaderClient {
672
769
  const result = await this.appClient.send.call(AbelReaderParamsFactory.getAssetLabels(params));
673
770
  return result.return;
674
771
  }
772
+ /**
773
+ * Makes a readonly (simulated) call to the AbelReader smart contract using the `getBlockTimesAndTc(uint64,uint64)(uint32,uint64)` ABI method.
774
+ *
775
+ * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
776
+ *
777
+ * @param params The params for the smart contract call
778
+ * @returns The call result
779
+ */
780
+ async getBlockTimesAndTc(params) {
781
+ const result = await this.appClient.send.call(AbelReaderParamsFactory.getBlockTimesAndTc(params));
782
+ return result.return;
783
+ }
675
784
  /**
676
785
  * Methods to access state for the current AbelReader app
677
786
  */
@@ -706,6 +815,14 @@ class AbelReaderClient {
706
815
  resultMappers.push((v) => client.decodeReturnValue('get_asset_labels(asset)string[]', v));
707
816
  return this;
708
817
  },
818
+ /**
819
+ * Add a getBlockTimesAndTc(uint64,uint64)(uint32,uint64) method call against the AbelReader contract
820
+ */
821
+ getBlockTimesAndTc(params) {
822
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.getBlockTimesAndTc(params)));
823
+ resultMappers.push((v) => client.decodeReturnValue('getBlockTimesAndTc(uint64,uint64)(uint32,uint64)', v));
824
+ return this;
825
+ },
709
826
  get update() {
710
827
  return {
711
828
  bare: (params) => {
@@ -872,7 +989,7 @@ export class AbelReaderSDK extends GhostBase {
872
989
  extraSimulateArgs,
873
990
  });
874
991
  }
875
- async get_asset_labels({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }) {
992
+ async getAssetLabels({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }) {
876
993
  return this.execute({
877
994
  signature: 'get_asset_labels(asset)string[]',
878
995
  txnBuilder: (builder, args) => builder.getAssetLabels(args),
@@ -881,5 +998,14 @@ export class AbelReaderSDK extends GhostBase {
881
998
  extraSimulateArgs,
882
999
  });
883
1000
  }
1001
+ async getBlockTimesAndTc({ methodArgsOrArgsArray, extraMethodCallArgs, extraSimulateArgs, }) {
1002
+ return this.execute({
1003
+ signature: 'getBlockTimesAndTc(uint64,uint64)(uint32,uint64)',
1004
+ txnBuilder: (builder, args) => builder.getBlockTimesAndTc(args),
1005
+ methodArgsOrArgsArray,
1006
+ extraMethodCallArgs,
1007
+ extraSimulateArgs,
1008
+ });
1009
+ }
884
1010
  }
885
1011
  /* END GHOST SDK CODE */
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import { AlgorandClient } from "@algorandfoundation/algokit-utils";
2
- import { AbelReaderSDK, AssetTinyLabels as AssetTinyLabelsInternal, BalanceInfo } from "./generated/AbelReaderSDK.js";
2
+ import { AbelReaderSDK, AssetTinyLabels as AssetTinyLabelsInternal, BalanceInfo, BlockTimeAndTc } from "./generated/AbelReaderSDK.js";
3
3
  export interface AssetTinyLabels extends AssetTinyLabelsInternal {
4
4
  id: bigint;
5
5
  }
6
+ export interface BlockRoundTimeAndTc extends BlockTimeAndTc {
7
+ rnd: bigint;
8
+ }
6
9
  export declare class AbelGhostSDK {
7
10
  static baseSDK: typeof AbelReaderSDK;
8
11
  algorand: AlgorandClient;
@@ -23,4 +26,5 @@ export declare class AbelGhostSDK {
23
26
  getAssetLabels(assetId: number | bigint): Promise<string[]>;
24
27
  getAllAssetIDs(): Promise<bigint[]>;
25
28
  private getBoxesByLength;
29
+ getBlockTimesAndTc(firstRound: number | bigint, lastRound: number | bigint): Promise<BlockRoundTimeAndTc[]>;
26
30
  }
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { AbelReaderSDK } from "./generated/AbelReaderSDK.js";
7
+ import { AbelReaderSDK, } from "./generated/AbelReaderSDK.js";
8
8
  import { chunked } from "./utils/chunked.js";
9
9
  import { decodeUint64 } from "algosdk";
10
10
  export class AbelGhostSDK {
@@ -59,6 +59,21 @@ export class AbelGhostSDK {
59
59
  const boxNames = await this.algorand.app.getBoxNames(this.registryAppId);
60
60
  return boxNames.filter((boxName) => boxName.nameRaw.length === length);
61
61
  }
62
+ async getBlockTimesAndTc(firstRound, lastRound) {
63
+ const firstDataRound = BigInt(firstRound);
64
+ const lastDataRound = BigInt(lastRound);
65
+ const simRound = BigInt(lastRound);
66
+ const firstValid = simRound + BigInt(1); // simulating with first-valid after simulate round, this is actually valid
67
+ const lastValid = simRound + BigInt(1);
68
+ return (await this.baseSDK.getBlockTimesAndTc({
69
+ methodArgsOrArgsArray: { firstRound: firstDataRound, lastRound: lastDataRound },
70
+ extraMethodCallArgs: { firstValidRound: firstValid, lastValidRound: lastValid },
71
+ extraSimulateArgs: { round: simRound },
72
+ })).map((data, i) => ({
73
+ ...data,
74
+ rnd: BigInt(firstDataRound) + BigInt(i),
75
+ }));
76
+ }
62
77
  }
63
78
  __decorate([
64
79
  chunked(63)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "abel-ghost-sdk",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "",
5
5
  "repository": {
6
6
  "type": "git",