@pezkuwi/api-contract 16.5.5

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.
Files changed (162) hide show
  1. package/README.md +3 -0
  2. package/build/Abi/index.d.ts +31 -0
  3. package/build/Abi/toLatestCompatible.d.ts +15 -0
  4. package/build/Abi/toV1.d.ts +3 -0
  5. package/build/Abi/toV2.d.ts +3 -0
  6. package/build/Abi/toV3.d.ts +3 -0
  7. package/build/Abi/toV4.d.ts +3 -0
  8. package/build/augment.d.ts +1 -0
  9. package/build/base/Base.d.ts +13 -0
  10. package/build/base/Blueprint.d.ts +24 -0
  11. package/build/base/Code.d.ts +22 -0
  12. package/build/base/Contract.d.ts +25 -0
  13. package/build/base/index.d.ts +3 -0
  14. package/build/base/mock.d.ts +3 -0
  15. package/build/base/types.d.ts +25 -0
  16. package/build/base/util.d.ts +16 -0
  17. package/build/bundle.d.ts +4 -0
  18. package/build/index.d.ts +2 -0
  19. package/build/packageDetect.d.ts +1 -0
  20. package/build/packageInfo.d.ts +6 -0
  21. package/build/promise/index.d.ts +13 -0
  22. package/build/promise/types.d.ts +3 -0
  23. package/build/rx/index.d.ts +13 -0
  24. package/build/rx/types.d.ts +3 -0
  25. package/build/types.d.ts +79 -0
  26. package/build/util.d.ts +5 -0
  27. package/package.json +39 -0
  28. package/src/Abi/Abi.spec.ts +235 -0
  29. package/src/Abi/index.ts +477 -0
  30. package/src/Abi/toLatestCompatible.spec.ts +219 -0
  31. package/src/Abi/toLatestCompatible.ts +52 -0
  32. package/src/Abi/toV1.ts +35 -0
  33. package/src/Abi/toV2.ts +58 -0
  34. package/src/Abi/toV3.ts +18 -0
  35. package/src/Abi/toV4.ts +21 -0
  36. package/src/augment.ts +4 -0
  37. package/src/base/Base.ts +52 -0
  38. package/src/base/Blueprint.ts +90 -0
  39. package/src/base/Code.spec.ts +47 -0
  40. package/src/base/Code.ts +142 -0
  41. package/src/base/Contract.ts +197 -0
  42. package/src/base/index.ts +6 -0
  43. package/src/base/mock.ts +48 -0
  44. package/src/base/types.ts +40 -0
  45. package/src/base/util.ts +56 -0
  46. package/src/bundle.ts +10 -0
  47. package/src/checkTypes.manual.ts +45 -0
  48. package/src/index.ts +6 -0
  49. package/src/mod.ts +4 -0
  50. package/src/packageDetect.ts +13 -0
  51. package/src/packageInfo.ts +6 -0
  52. package/src/promise/index.ts +28 -0
  53. package/src/promise/types.ts +7 -0
  54. package/src/rx/index.ts +28 -0
  55. package/src/rx/types.ts +7 -0
  56. package/src/test/compare/ink_v0_delegator.test.json +47 -0
  57. package/src/test/compare/ink_v0_dns.test.json +232 -0
  58. package/src/test/compare/ink_v0_erc20.test.json +253 -0
  59. package/src/test/compare/ink_v0_erc721.test.json +415 -0
  60. package/src/test/compare/ink_v0_flipper.test.json +9 -0
  61. package/src/test/compare/ink_v0_flipperBundle.test.json +9 -0
  62. package/src/test/compare/ink_v0_incrementer.test.json +9 -0
  63. package/src/test/compare/ink_v0_multisigPlain.test.json +562 -0
  64. package/src/test/compare/ink_v1_flipper.test.json +9 -0
  65. package/src/test/compare/ink_v1_psp22.test.json +531 -0
  66. package/src/test/compare/ink_v2_erc20.test.json +205 -0
  67. package/src/test/compare/ink_v2_flipper.test.json +9 -0
  68. package/src/test/compare/ink_v3_flipper.test.json +9 -0
  69. package/src/test/compare/ink_v3_traitErc20.test.json +205 -0
  70. package/src/test/compare/ink_v4_erc20Contract.test.json +253 -0
  71. package/src/test/compare/ink_v4_erc20Metadata.test.json +253 -0
  72. package/src/test/compare/ink_v4_flipperContract.test.json +155 -0
  73. package/src/test/compare/ink_v4_flipperMetadata.test.json +155 -0
  74. package/src/test/compare/ink_v5_erc20.test.json +370 -0
  75. package/src/test/compare/ink_v5_erc20AnonymousTransferMetadata.test.json +370 -0
  76. package/src/test/compare/ink_v5_erc20Contract.test.json +370 -0
  77. package/src/test/compare/ink_v5_erc20Metadata.test.json +370 -0
  78. package/src/test/compare/ink_v5_flipperContract.test.json +174 -0
  79. package/src/test/compare/ink_v5_flipperMetadata.test.json +174 -0
  80. package/src/test/compare/ink_v6_erc20Contract.test.json +418 -0
  81. package/src/test/compare/ink_v6_erc20Metadata.test.json +418 -0
  82. package/src/test/compare/solang_v0_ints256.test.json +9 -0
  83. package/src/test/compare/user_v0_assetTransfer.test.json +54 -0
  84. package/src/test/compare/user_v0_enumExample.test.json +303 -0
  85. package/src/test/compare/user_v0_recursive.test.json +27 -0
  86. package/src/test/compare/user_v0_withString.test.json +260 -0
  87. package/src/test/compare/user_v3_ask.test.json +71 -0
  88. package/src/test/compare/user_v4_events.test.json +1328 -0
  89. package/src/test/contracts/index.ts +20 -0
  90. package/src/test/contracts/ink/index.ts +13 -0
  91. package/src/test/contracts/ink/v0/accumulator.wasm +0 -0
  92. package/src/test/contracts/ink/v0/adder.wasm +0 -0
  93. package/src/test/contracts/ink/v0/delegator.json +252 -0
  94. package/src/test/contracts/ink/v0/delegator.wasm +0 -0
  95. package/src/test/contracts/ink/v0/dns.json +713 -0
  96. package/src/test/contracts/ink/v0/dns.wasm +0 -0
  97. package/src/test/contracts/ink/v0/erc20.json +704 -0
  98. package/src/test/contracts/ink/v0/erc20.wasm +0 -0
  99. package/src/test/contracts/ink/v0/erc721.json +1197 -0
  100. package/src/test/contracts/ink/v0/erc721.wasm +0 -0
  101. package/src/test/contracts/ink/v0/flipper.contract.json +107 -0
  102. package/src/test/contracts/ink/v0/flipper.json +106 -0
  103. package/src/test/contracts/ink/v0/flipper.wasm +0 -0
  104. package/src/test/contracts/ink/v0/incrementer.json +108 -0
  105. package/src/test/contracts/ink/v0/incrementer.wasm +0 -0
  106. package/src/test/contracts/ink/v0/index.ts +11 -0
  107. package/src/test/contracts/ink/v0/multisig_plain.json +1466 -0
  108. package/src/test/contracts/ink/v0/multisig_plain.wasm +0 -0
  109. package/src/test/contracts/ink/v0/subber.wasm +0 -0
  110. package/src/test/contracts/ink/v0/trait-flipper.json +103 -0
  111. package/src/test/contracts/ink/v0/trait-flipper.wasm +0 -0
  112. package/src/test/contracts/ink/v1/flipper.contract.json +111 -0
  113. package/src/test/contracts/ink/v1/index.ts +6 -0
  114. package/src/test/contracts/ink/v1/psp22_minter_pauser.contract.json +1722 -0
  115. package/src/test/contracts/ink/v2/erc20.contract.json +630 -0
  116. package/src/test/contracts/ink/v2/flipper.contract.json +103 -0
  117. package/src/test/contracts/ink/v2/index.ts +5 -0
  118. package/src/test/contracts/ink/v3/flipper.contract.json +105 -0
  119. package/src/test/contracts/ink/v3/index.ts +6 -0
  120. package/src/test/contracts/ink/v3/trait_erc20.contract.json +631 -0
  121. package/src/test/contracts/ink/v4/erc20.contract.json +1 -0
  122. package/src/test/contracts/ink/v4/erc20.json +821 -0
  123. package/src/test/contracts/ink/v4/erc20.wasm +0 -0
  124. package/src/test/contracts/ink/v4/flipper.contract.json +1 -0
  125. package/src/test/contracts/ink/v4/flipper.json +396 -0
  126. package/src/test/contracts/ink/v4/flipper.wasm +0 -0
  127. package/src/test/contracts/ink/v4/index.ts +7 -0
  128. package/src/test/contracts/ink/v5/erc20.contract.json +1 -0
  129. package/src/test/contracts/ink/v5/erc20.json +1025 -0
  130. package/src/test/contracts/ink/v5/erc20.wasm +0 -0
  131. package/src/test/contracts/ink/v5/erc20_anonymous_transfer.json +1025 -0
  132. package/src/test/contracts/ink/v5/flipper.contract.json +1 -0
  133. package/src/test/contracts/ink/v5/flipper.json +420 -0
  134. package/src/test/contracts/ink/v5/flipper.wasm +0 -0
  135. package/src/test/contracts/ink/v5/index.ts +8 -0
  136. package/src/test/contracts/ink/v6/erc20.contract.json +1 -0
  137. package/src/test/contracts/ink/v6/erc20.json +1081 -0
  138. package/src/test/contracts/ink/v6/erc20.polkavm +0 -0
  139. package/src/test/contracts/ink/v6/index.ts +5 -0
  140. package/src/test/contracts/solang/index.ts +7 -0
  141. package/src/test/contracts/solang/v0/index.ts +4 -0
  142. package/src/test/contracts/solang/v0/ints256.json +113 -0
  143. package/src/test/contracts/solang/v0/ints256.sol +13 -0
  144. package/src/test/contracts/solang/v0/ints256.wasm +0 -0
  145. package/src/test/contracts/user/index.ts +9 -0
  146. package/src/test/contracts/user/v0/assetTransfer.json +299 -0
  147. package/src/test/contracts/user/v0/assetTransfer.wasm +0 -0
  148. package/src/test/contracts/user/v0/enumExample.json +528 -0
  149. package/src/test/contracts/user/v0/enumExample.wasm +0 -0
  150. package/src/test/contracts/user/v0/index.ts +7 -0
  151. package/src/test/contracts/user/v0/recursive.contract.json +1 -0
  152. package/src/test/contracts/user/v0/withString.json +777 -0
  153. package/src/test/contracts/user/v3/ask.json +550 -0
  154. package/src/test/contracts/user/v3/index.ts +4 -0
  155. package/src/test/contracts/user/v4/events.contract.json +2990 -0
  156. package/src/test/contracts/user/v4/index.ts +4 -0
  157. package/src/test/contracts/util.ts +14 -0
  158. package/src/types.ts +98 -0
  159. package/src/util.ts +20 -0
  160. package/tsconfig.build.json +22 -0
  161. package/tsconfig.build.tsbuildinfo +1 -0
  162. package/tsconfig.spec.json +26 -0
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @pezkuwi/api-contract
2
+
3
+ Interfaces to allow for the encoding and decoding of Substrate contract ABIs.
@@ -0,0 +1,31 @@
1
+ import type { ChainProperties, ContractMetadataV4, ContractMetadataV5, ContractMetadataV6, ContractProjectInfo, EventRecord } from '@pezkuwi/types/interfaces';
2
+ import type { Codec, Registry, TypeDef } from '@pezkuwi/types/types';
3
+ import type { AbiConstructor, AbiEvent, AbiMessage, DecodedEvent, DecodedMessage } from '../types.js';
4
+ export type ContractMetadataSupported = ContractMetadataV4 | ContractMetadataV5 | ContractMetadataV6;
5
+ export declare class Abi {
6
+ #private;
7
+ readonly events: AbiEvent[];
8
+ readonly constructors: AbiConstructor[];
9
+ readonly info: ContractProjectInfo;
10
+ readonly json: Record<string, unknown>;
11
+ readonly messages: AbiMessage[];
12
+ readonly metadata: ContractMetadataSupported;
13
+ readonly registry: Registry;
14
+ readonly environment: Map<string, TypeDef | Codec>;
15
+ readonly isRevive: boolean;
16
+ constructor(abiJson: Record<string, unknown> | string, chainProperties?: ChainProperties);
17
+ /**
18
+ * Warning: Unstable API, bound to change
19
+ */
20
+ decodeEvent(record: EventRecord): DecodedEvent;
21
+ /**
22
+ * Warning: Unstable API, bound to change
23
+ */
24
+ decodeConstructor(data: Uint8Array): DecodedMessage;
25
+ /**
26
+ * Warning: Unstable API, bound to change
27
+ */
28
+ decodeMessage(data: Uint8Array): DecodedMessage;
29
+ findConstructor(constructorOrId: AbiConstructor | string | number): AbiConstructor;
30
+ findMessage(messageOrId: AbiMessage | string | number): AbiMessage;
31
+ }
@@ -0,0 +1,15 @@
1
+ import type { ContractMetadataV4, ContractMetadataV5, ContractMetadataV6 } from '@pezkuwi/types/interfaces';
2
+ import type { Registry } from '@pezkuwi/types/types';
3
+ import type { ContractMetadataSupported } from './index.js';
4
+ export declare const enumVersions: readonly ["V6", "V5", "V4", "V3", "V2", "V1"];
5
+ type Versions = typeof enumVersions[number] | 'V0';
6
+ type Converter = (registry: Registry, vx: any) => ContractMetadataSupported;
7
+ export declare function v6ToLatestCompatible(_registry: Registry, v6: ContractMetadataV6): ContractMetadataV6;
8
+ export declare function v5ToLatestCompatible(_registry: Registry, v5: ContractMetadataV5): ContractMetadataV5;
9
+ export declare function v4ToLatestCompatible(_registry: Registry, v4: ContractMetadataV4): ContractMetadataV4;
10
+ export declare const v3ToLatestCompatible: (registry: Registry, input: import("@pezkuwi/types/interfaces").ContractMetadataV3) => ContractMetadataSupported;
11
+ export declare const v2ToLatestCompatible: (registry: Registry, input: import("@pezkuwi/types/interfaces").ContractMetadataV2) => ContractMetadataSupported;
12
+ export declare const v1ToLatestCompatible: (registry: Registry, input: import("@pezkuwi/types/interfaces").ContractMetadataV1) => ContractMetadataSupported;
13
+ export declare const v0ToLatestCompatible: (registry: Registry, input: import("@pezkuwi/types/interfaces").ContractMetadataV0) => ContractMetadataSupported;
14
+ export declare const convertVersions: [Versions, Converter][];
15
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { ContractMetadataV0, ContractMetadataV1 } from '@pezkuwi/types/interfaces';
2
+ import type { Registry } from '@pezkuwi/types/types';
3
+ export declare function v0ToV1(registry: Registry, v0: ContractMetadataV0): ContractMetadataV1;
@@ -0,0 +1,3 @@
1
+ import type { ContractMetadataV1, ContractMetadataV2 } from '@pezkuwi/types/interfaces';
2
+ import type { Registry } from '@pezkuwi/types/types';
3
+ export declare function v1ToV2(registry: Registry, v1: ContractMetadataV1): ContractMetadataV2;
@@ -0,0 +1,3 @@
1
+ import type { ContractMetadataV2, ContractMetadataV3 } from '@pezkuwi/types/interfaces';
2
+ import type { Registry } from '@pezkuwi/types/types';
3
+ export declare function v2ToV3(registry: Registry, v2: ContractMetadataV2): ContractMetadataV3;
@@ -0,0 +1,3 @@
1
+ import type { ContractMetadataV3, ContractMetadataV4 } from '@pezkuwi/types/interfaces';
2
+ import type { Registry } from '@pezkuwi/types/types';
3
+ export declare function v3ToV4(registry: Registry, v3: ContractMetadataV3): ContractMetadataV4;
@@ -0,0 +1 @@
1
+ import '@pezkuwi/api-augment';
@@ -0,0 +1,13 @@
1
+ import type { ApiBase } from '@pezkuwi/api/base';
2
+ import type { ApiTypes, DecorateMethod } from '@pezkuwi/api/types';
3
+ import type { Registry } from '@pezkuwi/types/types';
4
+ import { Abi } from '../Abi/index.js';
5
+ export declare abstract class Base<ApiType extends ApiTypes> {
6
+ readonly abi: Abi;
7
+ readonly api: ApiBase<ApiType>;
8
+ protected readonly _decorateMethod: DecorateMethod<ApiType>;
9
+ protected readonly _isWeightV1: boolean;
10
+ protected readonly _isRevive: boolean;
11
+ constructor(api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, decorateMethod: DecorateMethod<ApiType>);
12
+ get registry(): Registry;
13
+ }
@@ -0,0 +1,24 @@
1
+ import type { ApiBase } from '@pezkuwi/api/base';
2
+ import type { ApiTypes, DecorateMethod } from '@pezkuwi/api/types';
3
+ import type { Hash } from '@pezkuwi/types/interfaces';
4
+ import type { ISubmittableResult } from '@pezkuwi/types/types';
5
+ import type { Abi } from '../Abi/index.js';
6
+ import type { MapConstructorExec } from './types.js';
7
+ import { SubmittableResult } from '@pezkuwi/api';
8
+ import { Base } from './Base.js';
9
+ import { Contract } from './Contract.js';
10
+ export type BlueprintConstructor<ApiType extends ApiTypes> = new (api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, codeHash: string | Hash | Uint8Array) => Blueprint<ApiType>;
11
+ export declare class BlueprintSubmittableResult<ApiType extends ApiTypes> extends SubmittableResult {
12
+ readonly contract?: Contract<ApiType> | undefined;
13
+ constructor(result: ISubmittableResult, contract?: Contract<ApiType>);
14
+ }
15
+ export declare class Blueprint<ApiType extends ApiTypes> extends Base<ApiType> {
16
+ #private;
17
+ /**
18
+ * @description The on-chain code hash for this blueprint
19
+ */
20
+ readonly codeHash: Hash;
21
+ constructor(api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, codeHash: string | Hash | Uint8Array, decorateMethod: DecorateMethod<ApiType>);
22
+ get tx(): MapConstructorExec<ApiType>;
23
+ }
24
+ export declare function extendBlueprint<ApiType extends ApiTypes>(type: ApiType, decorateMethod: DecorateMethod<ApiType>): BlueprintConstructor<ApiType>;
@@ -0,0 +1,22 @@
1
+ import type { ApiBase } from '@pezkuwi/api/base';
2
+ import type { ApiTypes, DecorateMethod } from '@pezkuwi/api/types';
3
+ import type { ISubmittableResult } from '@pezkuwi/types/types';
4
+ import type { Abi } from '../Abi/index.js';
5
+ import type { MapConstructorExec } from './types.js';
6
+ import { SubmittableResult } from '@pezkuwi/api';
7
+ import { Base } from './Base.js';
8
+ import { Blueprint } from './Blueprint.js';
9
+ import { Contract } from './Contract.js';
10
+ export type CodeConstructor<ApiType extends ApiTypes> = new (api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, wasm: Uint8Array | string | Buffer | null | undefined) => Code<ApiType>;
11
+ export declare class CodeSubmittableResult<ApiType extends ApiTypes> extends SubmittableResult {
12
+ readonly blueprint?: Blueprint<ApiType> | undefined;
13
+ readonly contract?: Contract<ApiType> | undefined;
14
+ constructor(result: ISubmittableResult, blueprint?: Blueprint<ApiType> | undefined, contract?: Contract<ApiType> | undefined);
15
+ }
16
+ export declare class Code<ApiType extends ApiTypes> extends Base<ApiType> {
17
+ #private;
18
+ readonly code: Uint8Array;
19
+ constructor(api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, wasm: Uint8Array | string | Buffer | null | undefined, decorateMethod: DecorateMethod<ApiType>);
20
+ get tx(): MapConstructorExec<ApiType>;
21
+ }
22
+ export declare function extendCode<ApiType extends ApiTypes>(type: ApiType, decorateMethod: DecorateMethod<ApiType>): CodeConstructor<ApiType>;
@@ -0,0 +1,25 @@
1
+ import type { ApiBase } from '@pezkuwi/api/base';
2
+ import type { ApiTypes, DecorateMethod } from '@pezkuwi/api/types';
3
+ import type { AccountId, AccountId20 } from '@pezkuwi/types/interfaces';
4
+ import type { ISubmittableResult } from '@pezkuwi/types/types';
5
+ import type { Abi } from '../Abi/index.js';
6
+ import type { DecodedEvent } from '../types.js';
7
+ import type { MapMessageQuery, MapMessageTx } from './types.js';
8
+ import { SubmittableResult } from '@pezkuwi/api';
9
+ import { Base } from './Base.js';
10
+ export type ContractConstructor<ApiType extends ApiTypes> = new (api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, address: string | AccountId) => Contract<ApiType>;
11
+ export declare class ContractSubmittableResult extends SubmittableResult {
12
+ readonly contractEvents?: DecodedEvent[] | undefined;
13
+ constructor(result: ISubmittableResult, contractEvents?: DecodedEvent[]);
14
+ }
15
+ export declare class Contract<ApiType extends ApiTypes> extends Base<ApiType> {
16
+ #private;
17
+ /**
18
+ * @description The on-chain address for this contract
19
+ */
20
+ readonly address: AccountId | AccountId20;
21
+ constructor(api: ApiBase<ApiType>, abi: string | Record<string, unknown> | Abi, address: string | AccountId | AccountId20, decorateMethod: DecorateMethod<ApiType>);
22
+ get query(): MapMessageQuery<ApiType>;
23
+ get tx(): MapMessageTx<ApiType>;
24
+ }
25
+ export declare function extendContract<ApiType extends ApiTypes>(type: ApiType, decorateMethod: DecorateMethod<ApiType>): ContractConstructor<ApiType>;
@@ -0,0 +1,3 @@
1
+ export { Blueprint, BlueprintSubmittableResult, extendBlueprint } from './Blueprint.js';
2
+ export { Code, CodeSubmittableResult, extendCode } from './Code.js';
3
+ export { Contract, extendContract } from './Contract.js';
@@ -0,0 +1,3 @@
1
+ import type { ApiBase } from '@pezkuwi/api/base';
2
+ export declare const mockApi: ApiBase<"promise">;
3
+ export declare const mockReviveApi: ApiBase<"promise">;
@@ -0,0 +1,25 @@
1
+ import type { Observable } from 'rxjs';
2
+ import type { SubmittableExtrinsic } from '@pezkuwi/api/submittable/types';
3
+ import type { ApiTypes, ObsInnerType } from '@pezkuwi/api/types';
4
+ import type { AccountId } from '@pezkuwi/types/interfaces';
5
+ import type { AbiMessage, BlueprintOptions, ContractCallOutcome, ContractOptions } from '../types.js';
6
+ export interface MessageMeta {
7
+ readonly meta: AbiMessage;
8
+ }
9
+ export interface BlueprintDeploy<ApiType extends ApiTypes> extends MessageMeta {
10
+ (options: BlueprintOptions, ...params: unknown[]): SubmittableExtrinsic<ApiType>;
11
+ }
12
+ export interface ContractQuery<ApiType extends ApiTypes> extends MessageMeta {
13
+ (origin: AccountId | string | Uint8Array, options: ContractOptions, ...params: unknown[]): ContractCallResult<ApiType, ContractCallOutcome>;
14
+ }
15
+ export interface ContractTx<ApiType extends ApiTypes> extends MessageMeta {
16
+ (options: ContractOptions, ...params: unknown[]): SubmittableExtrinsic<ApiType>;
17
+ }
18
+ export type ContractGeneric<O, T> = (messageOrId: AbiMessage | string | number, options: O, ...params: unknown[]) => T;
19
+ export type ContractCallResult<ApiType extends ApiTypes, T> = ApiType extends 'rxjs' ? Observable<T> : Promise<ObsInnerType<Observable<T>>>;
20
+ export interface ContractCallSend<ApiType extends ApiTypes> {
21
+ send(account: string | AccountId | Uint8Array): ContractCallResult<ApiType, ContractCallOutcome>;
22
+ }
23
+ export type MapConstructorExec<ApiType extends ApiTypes> = Record<string, BlueprintDeploy<ApiType>>;
24
+ export type MapMessageTx<ApiType extends ApiTypes> = Record<string, ContractTx<ApiType>>;
25
+ export type MapMessageQuery<ApiType extends ApiTypes> = Record<string, ContractQuery<ApiType>>;
@@ -0,0 +1,16 @@
1
+ import type { SubmittableResult } from '@pezkuwi/api';
2
+ import type { SubmittableExtrinsic } from '@pezkuwi/api/submittable/types';
3
+ import type { ApiTypes } from '@pezkuwi/api/types';
4
+ import type { WeightV1, WeightV2 } from '@pezkuwi/types/interfaces';
5
+ import type { BN } from '@pezkuwi/util';
6
+ import type { AbiConstructor, AbiMessage, BlueprintOptions, WeightAll } from '../types.js';
7
+ import type { BlueprintDeploy, ContractGeneric } from './types.js';
8
+ export declare const EMPTY_SALT: Uint8Array<ArrayBuffer>;
9
+ export declare function withMeta<T extends {
10
+ meta: AbiMessage;
11
+ }>(meta: AbiMessage, creator: Omit<T, 'meta'>): T;
12
+ export declare function createBluePrintTx<ApiType extends ApiTypes, R extends SubmittableResult>(meta: AbiMessage, fn: (options: BlueprintOptions, params: unknown[]) => SubmittableExtrinsic<ApiType, R>): BlueprintDeploy<ApiType>;
13
+ export declare function createBluePrintWithId<T>(fn: (constructorOrId: AbiConstructor | string | number, options: BlueprintOptions, params: unknown[]) => T): ContractGeneric<BlueprintOptions, T>;
14
+ export declare function encodeSalt(salt?: Uint8Array | string | null): Uint8Array;
15
+ export declare function convertWeight(weight: WeightV1 | WeightV2 | bigint | string | number | BN): WeightAll;
16
+ export declare function isWeightV2(weight: WeightV1 | WeightV2 | bigint | string | number | BN): weight is WeightV2;
@@ -0,0 +1,4 @@
1
+ export { Abi } from './Abi/index.js';
2
+ export { packageInfo } from './packageInfo.js';
3
+ export * from './promise/index.js';
4
+ export * from './rx/index.js';
@@ -0,0 +1,2 @@
1
+ import './packageDetect.js';
2
+ export * from './bundle.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export declare const packageInfo: {
2
+ name: string;
3
+ path: string;
4
+ type: string;
5
+ version: string;
6
+ };
@@ -0,0 +1,13 @@
1
+ import type { ApiPromise } from '@pezkuwi/api';
2
+ import type { AccountId, AccountId20, Hash } from '@pezkuwi/types/interfaces';
3
+ import type { Abi } from '../Abi/index.js';
4
+ import { Blueprint, Code, Contract } from '../base/index.js';
5
+ export declare class BlueprintPromise extends Blueprint<'promise'> {
6
+ constructor(api: ApiPromise, abi: string | Record<string, unknown> | Abi, codeHash: string | Hash);
7
+ }
8
+ export declare class CodePromise extends Code<'promise'> {
9
+ constructor(api: ApiPromise, abi: string | Record<string, unknown> | Abi, wasm: Uint8Array | string | Buffer | null | undefined);
10
+ }
11
+ export declare class ContractPromise extends Contract<'promise'> {
12
+ constructor(api: ApiPromise, abi: string | Record<string, unknown> | Abi, address: string | AccountId | AccountId20);
13
+ }
@@ -0,0 +1,3 @@
1
+ import type { BlueprintSubmittableResult as BaseBlueprintSubmittableResult, CodeSubmittableResult as BaseCodeSubmittableResult } from '../base/index.js';
2
+ export type BlueprintSubmittableResult = BaseBlueprintSubmittableResult<'promise'>;
3
+ export type CodeSubmittableResult = BaseCodeSubmittableResult<'promise'>;
@@ -0,0 +1,13 @@
1
+ import type { ApiRx } from '@pezkuwi/api';
2
+ import type { AccountId, Hash } from '@pezkuwi/types/interfaces';
3
+ import type { Abi } from '../Abi/index.js';
4
+ import { Blueprint, Code, Contract } from '../base/index.js';
5
+ export declare class BlueprintRx extends Blueprint<'rxjs'> {
6
+ constructor(api: ApiRx, abi: string | Record<string, unknown> | Abi, codeHash: string | Hash);
7
+ }
8
+ export declare class CodeRx extends Code<'rxjs'> {
9
+ constructor(api: ApiRx, abi: string | Record<string, unknown> | Abi, wasm: Uint8Array | string | Buffer | null | undefined);
10
+ }
11
+ export declare class ContractRx extends Contract<'rxjs'> {
12
+ constructor(api: ApiRx, abi: string | Record<string, unknown> | Abi, address: string | AccountId);
13
+ }
@@ -0,0 +1,3 @@
1
+ import type { BlueprintSubmittableResult as BaseBlueprintSubmittableResult, CodeSubmittableResult as BaseCodeSubmittableResult } from '../base/index.js';
2
+ export type BlueprintSubmittableResult = BaseBlueprintSubmittableResult<'promise'>;
3
+ export type CodeSubmittableResult = BaseCodeSubmittableResult<'promise'>;
@@ -0,0 +1,79 @@
1
+ import type { ApiBase } from '@pezkuwi/api/base';
2
+ import type { ApiTypes } from '@pezkuwi/api/types';
3
+ import type { Text } from '@pezkuwi/types';
4
+ import type { ContractExecResultResult, ContractSelector, StorageDeposit, Weight, WeightV2 } from '@pezkuwi/types/interfaces';
5
+ import type { Codec, TypeDef } from '@pezkuwi/types/types';
6
+ import type { BN } from '@pezkuwi/util';
7
+ import type { HexString } from '@pezkuwi/util/types';
8
+ import type { Abi } from './index.js';
9
+ export interface ContractBase<ApiType extends ApiTypes> {
10
+ readonly abi: Abi;
11
+ readonly api: ApiBase<ApiType>;
12
+ getMessage: (name: string) => AbiMessage;
13
+ messages: AbiMessage[];
14
+ }
15
+ export interface AbiParam {
16
+ name: string;
17
+ type: TypeDef;
18
+ }
19
+ export type AbiMessageParam = AbiParam;
20
+ export interface AbiEventParam extends AbiParam {
21
+ indexed: boolean;
22
+ }
23
+ export interface AbiEvent {
24
+ args: AbiEventParam[];
25
+ docs: string[];
26
+ fromU8a: (data: Uint8Array) => DecodedEvent;
27
+ identifier: string;
28
+ index: number;
29
+ signatureTopic?: HexString | null;
30
+ }
31
+ export interface AbiMessage {
32
+ args: AbiMessageParam[];
33
+ docs: string[];
34
+ fromU8a: (data: Uint8Array) => DecodedMessage;
35
+ identifier: string;
36
+ index: number;
37
+ isConstructor?: boolean;
38
+ isDefault?: boolean;
39
+ isMutating?: boolean;
40
+ isPayable?: boolean;
41
+ method: string;
42
+ path: string[];
43
+ returnType?: TypeDef | null;
44
+ selector: ContractSelector;
45
+ toU8a: (params: unknown[]) => Uint8Array;
46
+ }
47
+ export type AbiConstructor = AbiMessage;
48
+ export type InterfaceContractCalls = Record<string, Function>;
49
+ export interface ContractCallOutcome {
50
+ debugMessage: Text;
51
+ gasConsumed: Weight;
52
+ gasRequired: Weight;
53
+ output: Codec | null;
54
+ result: ContractExecResultResult;
55
+ storageDeposit: StorageDeposit;
56
+ }
57
+ export interface DecodedEvent {
58
+ args: Codec[];
59
+ event: AbiEvent;
60
+ }
61
+ export interface DecodedMessage {
62
+ args: Codec[];
63
+ message: AbiMessage;
64
+ }
65
+ export interface ContractOptions {
66
+ gasLimit?: bigint | string | number | BN | WeightV2;
67
+ storageDepositLimit?: bigint | string | number | BN | null;
68
+ value?: bigint | BN | string | number;
69
+ }
70
+ export interface BlueprintOptions extends ContractOptions {
71
+ salt?: Uint8Array | string | null;
72
+ }
73
+ export interface WeightAll {
74
+ v1Weight: BN;
75
+ v2Weight: {
76
+ refTime: BN;
77
+ proofSize?: BN | undefined;
78
+ };
79
+ }
@@ -0,0 +1,5 @@
1
+ import type { SubmittableResult } from '@pezkuwi/api';
2
+ import type { EventRecord } from '@pezkuwi/types/interfaces';
3
+ type ContractEvents = 'CodeStored' | 'ContractEmitted' | 'ContractExecution' | 'Instantiated';
4
+ export declare function applyOnEvent<T>(result: SubmittableResult, types: ContractEvents[], fn: (records: EventRecord[]) => T, isRevive: boolean): T | undefined;
5
+ export {};
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "author": "Jaco Greeff <jacogr@gmail.com>",
3
+ "bugs": "https://github.com/pezkuwichain/pezkuwi-api/issues",
4
+ "description": "Interfaces for interacting with contracts and contract ABIs",
5
+ "engines": {
6
+ "node": ">=18"
7
+ },
8
+ "homepage": "https://github.com/pezkuwichain/pezkuwi-api/tree/master/packages/api-contract#readme",
9
+ "license": "Apache-2.0",
10
+ "name": "@pezkuwi/api-contract",
11
+ "repository": {
12
+ "directory": "packages/api-contract",
13
+ "type": "git",
14
+ "url": "https://github.com/pezkuwichain/pezkuwi-api.git"
15
+ },
16
+ "sideEffects": [
17
+ "./packageDetect.js",
18
+ "./packageDetect.cjs"
19
+ ],
20
+ "type": "module",
21
+ "version": "16.5.5",
22
+ "main": "index.js",
23
+ "dependencies": {
24
+ "@pezkuwi/api": "16.5.5",
25
+ "@pezkuwi/api-augment": "16.5.5",
26
+ "@pezkuwi/types": "16.5.5",
27
+ "@pezkuwi/types-codec": "16.5.5",
28
+ "@pezkuwi/types-create": "16.5.5",
29
+ "@pezkuwi/util": "14.0.5",
30
+ "@pezkuwi/util-crypto": "14.0.5",
31
+ "rxjs": "^7.8.1",
32
+ "tslib": "^2.8.1"
33
+ },
34
+ "devDependencies": {
35
+ "@pezkuwi/api-augment": "16.5.5",
36
+ "@pezkuwi/keyring": "14.0.5",
37
+ "@pezkuwi/types-support": "16.5.5"
38
+ }
39
+ }
@@ -0,0 +1,235 @@
1
+ // Copyright 2017-2025 @polkadot/api-contract authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /// <reference types="@pezkuwi/dev-test/globals.d.ts" />
5
+
6
+ import type { Registry } from '@pezkuwi/types/types';
7
+
8
+ import fs from 'node:fs';
9
+ import process from 'node:process';
10
+
11
+ import { TypeDefInfo } from '@pezkuwi/types/types';
12
+ import rpcMetadata from '@pezkuwi/types-support/metadata/static-substrate-contracts-node';
13
+ import { blake2AsHex } from '@pezkuwi/util-crypto';
14
+
15
+ import { Metadata, TypeRegistry } from '../../../types/src/bundle.js';
16
+ import abis from '../test/contracts/index.js';
17
+ import { Abi } from './index.js';
18
+
19
+ interface SpecDef {
20
+ messages: {
21
+ label: string;
22
+ name: string[] | string
23
+ }[]
24
+ }
25
+
26
+ interface JSONAbi {
27
+ source: {
28
+ compiler: string,
29
+ hash: string,
30
+ language: string,
31
+ wasm: string
32
+ },
33
+ spec: SpecDef;
34
+ V1: {
35
+ spec: SpecDef;
36
+ },
37
+ V2: {
38
+ spec: SpecDef;
39
+ },
40
+ V3: {
41
+ spec: SpecDef;
42
+ },
43
+ V4: {
44
+ spec: SpecDef;
45
+ }
46
+ }
47
+
48
+ function stringifyInfo (key: string, value: unknown): unknown {
49
+ return key === 'info' && typeof value === 'number'
50
+ ? TypeDefInfo[value]
51
+ : value;
52
+ }
53
+
54
+ function stringifyJson (registry: Registry): string {
55
+ const defs = registry.lookup.types.map(({ id }) =>
56
+ registry.lookup.getTypeDef(id)
57
+ );
58
+
59
+ return JSON.stringify(defs, stringifyInfo, 2);
60
+ }
61
+
62
+ describe('Abi', (): void => {
63
+ describe('ABI', (): void => {
64
+ Object.entries(abis).forEach(([abiName, _abi]) => {
65
+ const abi = _abi as unknown as JSONAbi;
66
+
67
+ it(`initializes from a contract ABI (${abiName})`, (): void => {
68
+ try {
69
+ const messageIds = (abi.V4 || abi.V3 || abi.V2 || abi.V1 || abi).spec.messages.map(({ label, name }) =>
70
+ label || (
71
+ Array.isArray(name)
72
+ ? name.join('::')
73
+ : name
74
+ )
75
+ );
76
+ const inkAbi = new Abi(abis[abiName]);
77
+
78
+ expect(inkAbi.messages.map(({ identifier }) => identifier)).toEqual(messageIds);
79
+ } catch (error) {
80
+ console.error(error);
81
+
82
+ throw error;
83
+ }
84
+ });
85
+ });
86
+ });
87
+
88
+ describe('TypeDef', (): void => {
89
+ for (const [abiName, abiJson] of Object.entries(abis)) {
90
+ it(`initializes from a contract ABI: ${abiName}`, (): void => {
91
+ const abi = new Abi(abiJson);
92
+ const registryJson = stringifyJson(abi.registry);
93
+ const cmpFile = new URL(`../test/compare/${abiName}.test.json`, import.meta.url);
94
+
95
+ try {
96
+ expect(
97
+ JSON.parse(registryJson)
98
+ ).toEqual(
99
+ JSON.parse(fs.readFileSync(cmpFile, 'utf-8'))
100
+ );
101
+ } catch (error) {
102
+ if (process.env['GITHUB_REPOSITORY']) {
103
+ console.error(registryJson);
104
+
105
+ throw error;
106
+ }
107
+
108
+ fs.writeFileSync(cmpFile, registryJson, { flag: 'w' });
109
+ }
110
+ });
111
+ }
112
+ });
113
+
114
+ it('has the correct hash for the source', (): void => {
115
+ const abi = new Abi(abis['ink_v0_flipperBundle']);
116
+ const bundle = abis['ink_v0_flipperBundle'] as unknown as JSONAbi;
117
+
118
+ // manual
119
+ expect(bundle.source.hash).toEqual(blake2AsHex(bundle.source.wasm));
120
+
121
+ // the Codec hash
122
+ expect(bundle.source.hash).toEqual(abi.info.source.wasm.hash.toHex());
123
+
124
+ // the hash as per the actual Abi
125
+ expect(bundle.source.hash).toEqual(abi.info.source.wasmHash.toHex());
126
+ });
127
+
128
+ describe('Events', (): void => {
129
+ const registry = new TypeRegistry();
130
+
131
+ beforeAll((): void => {
132
+ const metadata = new Metadata(registry, rpcMetadata);
133
+
134
+ registry.setMetadata(metadata);
135
+ });
136
+
137
+ it('decoding <=ink!v4 event', (): void => {
138
+ const abiJson = abis['ink_v4_erc20Metadata'];
139
+
140
+ expect(abiJson).toBeDefined();
141
+ const abi = new Abi(abiJson);
142
+
143
+ const eventRecordHex =
144
+ '0x0001000000080360951b8baf569bca905a279c12d6ce17db7cdce23a42563870ef585129ce5dc64d010001d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d018eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4800505a4f7e9f4eb106000000000000000c0045726332303a3a5472616e7366657200000000000000000000000000000000da2d695d3b5a304e0039e7fc4419c34fa0c1f239189c99bb72a6484f1634782b2b00c7d40fe6d84d660f3e6bed90f218e022a0909f7e1a7ea35ada8b6e003564';
145
+ const record = registry.createType('EventRecord', eventRecordHex);
146
+
147
+ const decodedEvent = abi.decodeEvent(record);
148
+
149
+ expect(decodedEvent.event.args.length).toEqual(3);
150
+ expect(decodedEvent.args.length).toEqual(3);
151
+ expect(decodedEvent.event.identifier).toEqual('Transfer');
152
+
153
+ const decodedEventHuman = decodedEvent.event.args.reduce((prev, cur, index) => {
154
+ return {
155
+ ...prev,
156
+ [cur.name]: decodedEvent.args[index].toHuman()
157
+ };
158
+ }, {});
159
+
160
+ const expectedEvent = {
161
+ from: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
162
+ to: '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty',
163
+ value: '123.4567 MUnit'
164
+ };
165
+
166
+ expect(decodedEventHuman).toEqual(expectedEvent);
167
+ });
168
+
169
+ it('decoding >=ink!v5 event', (): void => {
170
+ const abiJson = abis['ink_v5_erc20Metadata'];
171
+
172
+ expect(abiJson).toBeDefined();
173
+ const abi = new Abi(abiJson);
174
+
175
+ const eventRecordHex =
176
+ '0x00010000000803da17150e96b3955a4db6ad35ddeb495f722f9c1d84683113bfb096bf3faa30f2490101d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d018eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4800505a4f7e9f4eb106000000000000000cb5b61a3e6a21a16be4f044b517c28ac692492f73c5bfd3f60178ad98c767f4cbd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48';
177
+ const record = registry.createType('EventRecord', eventRecordHex);
178
+
179
+ const decodedEvent = abi.decodeEvent(record);
180
+
181
+ expect(decodedEvent.event.args.length).toEqual(3);
182
+ expect(decodedEvent.args.length).toEqual(3);
183
+ expect(decodedEvent.event.identifier).toEqual('erc20::erc20::Transfer');
184
+
185
+ const decodedEventHuman = decodedEvent.event.args.reduce((prev, cur, index) => {
186
+ return {
187
+ ...prev,
188
+ [cur.name]: decodedEvent.args[index].toHuman()
189
+ };
190
+ }, {});
191
+
192
+ const expectedEvent = {
193
+ from: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
194
+ to: '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty',
195
+ value: '123.4567 MUnit'
196
+ };
197
+
198
+ expect(decodedEventHuman).toEqual(expectedEvent);
199
+ });
200
+
201
+ it('decoding >=ink!v5 anonymous event', (): void => {
202
+ const abiJson = abis['ink_v5_erc20AnonymousTransferMetadata'];
203
+
204
+ expect(abiJson).toBeDefined();
205
+ const abi = new Abi(abiJson);
206
+
207
+ expect(abi.events[0].identifier).toEqual('erc20::erc20::Transfer');
208
+ expect(abi.events[0].signatureTopic).toEqual(null);
209
+
210
+ const eventRecordWithAnonymousEventHex = '0x00010000000803538e726248a9c155911e7d99f4f474c3408630a2f6275dd501d4471c7067ad2c490101d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d018eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4800505a4f7e9f4eb1060000000000000008d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48';
211
+ const record = registry.createType('EventRecord', eventRecordWithAnonymousEventHex);
212
+
213
+ const decodedEvent = abi.decodeEvent(record);
214
+
215
+ expect(decodedEvent.event.args.length).toEqual(3);
216
+ expect(decodedEvent.args.length).toEqual(3);
217
+ expect(decodedEvent.event.identifier).toEqual('erc20::erc20::Transfer');
218
+
219
+ const decodedEventHuman = decodedEvent.event.args.reduce((prev, cur, index) => {
220
+ return {
221
+ ...prev,
222
+ [cur.name]: decodedEvent.args[index].toHuman()
223
+ };
224
+ }, {});
225
+
226
+ const expectedEvent = {
227
+ from: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY',
228
+ to: '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty',
229
+ value: '123.4567 MUnit'
230
+ };
231
+
232
+ expect(decodedEventHuman).toEqual(expectedEvent);
233
+ });
234
+ });
235
+ });