schemos 0.0.1 → 0.1.0

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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/dist/client.d.ts +8 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +2 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/client.test-d.d.ts +2 -0
  7. package/dist/client.test-d.d.ts.map +1 -0
  8. package/dist/client.test-d.js +41 -0
  9. package/dist/client.test-d.js.map +1 -0
  10. package/dist/contract.bench-d.d.ts +2 -0
  11. package/dist/contract.bench-d.d.ts.map +1 -0
  12. package/dist/contract.bench-d.js +67 -0
  13. package/dist/contract.bench-d.js.map +1 -0
  14. package/dist/contract.d.ts +27 -0
  15. package/dist/contract.d.ts.map +1 -0
  16. package/dist/contract.js +30 -0
  17. package/dist/contract.js.map +1 -0
  18. package/dist/contract.test-d.d.ts +2 -0
  19. package/dist/contract.test-d.d.ts.map +1 -0
  20. package/dist/contract.test-d.js +147 -0
  21. package/dist/contract.test-d.js.map +1 -0
  22. package/dist/contract.test.d.ts +2 -0
  23. package/dist/contract.test.d.ts.map +1 -0
  24. package/dist/contract.test.js +77 -0
  25. package/dist/contract.test.js.map +1 -0
  26. package/dist/index.d.ts +5 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +2 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/schemas/cw20/execute.d.ts +367 -0
  31. package/dist/schemas/cw20/execute.d.ts.map +1 -0
  32. package/dist/schemas/cw20/execute.js +398 -0
  33. package/dist/schemas/cw20/execute.js.map +1 -0
  34. package/dist/schemas/cw20/index.d.ts +905 -0
  35. package/dist/schemas/cw20/index.d.ts.map +1 -0
  36. package/dist/schemas/cw20/index.js +10 -0
  37. package/dist/schemas/cw20/index.js.map +1 -0
  38. package/dist/schemas/cw20/query.d.ts +160 -0
  39. package/dist/schemas/cw20/query.d.ts.map +1 -0
  40. package/dist/schemas/cw20/query.js +170 -0
  41. package/dist/schemas/cw20/query.js.map +1 -0
  42. package/dist/schemas/cw20/responses.d.ts +386 -0
  43. package/dist/schemas/cw20/responses.d.ts.map +1 -0
  44. package/dist/schemas/cw20/responses.js +416 -0
  45. package/dist/schemas/cw20/responses.js.map +1 -0
  46. package/dist/schemas/cw721/execute.d.ts +543 -0
  47. package/dist/schemas/cw721/execute.d.ts.map +1 -0
  48. package/dist/schemas/cw721/execute.js +597 -0
  49. package/dist/schemas/cw721/execute.js.map +1 -0
  50. package/dist/schemas/cw721/index.d.ts +2507 -0
  51. package/dist/schemas/cw721/index.d.ts.map +1 -0
  52. package/dist/schemas/cw721/index.js +10 -0
  53. package/dist/schemas/cw721/index.js.map +1 -0
  54. package/dist/schemas/cw721/query.d.ts +487 -0
  55. package/dist/schemas/cw721/query.d.ts.map +1 -0
  56. package/dist/schemas/cw721/query.js +526 -0
  57. package/dist/schemas/cw721/query.js.map +1 -0
  58. package/dist/schemas/cw721/responses.d.ts +1485 -0
  59. package/dist/schemas/cw721/responses.d.ts.map +1 -0
  60. package/dist/schemas/cw721/responses.js +1675 -0
  61. package/dist/schemas/cw721/responses.js.map +1 -0
  62. package/dist/schemas/index.d.ts +3 -0
  63. package/dist/schemas/index.d.ts.map +1 -0
  64. package/dist/schemas/index.js +3 -0
  65. package/dist/schemas/index.js.map +1 -0
  66. package/dist/schemas/schemas.test-d.d.ts +2 -0
  67. package/dist/schemas/schemas.test-d.d.ts.map +1 -0
  68. package/dist/schemas/schemas.test-d.js +92 -0
  69. package/dist/schemas/schemas.test-d.js.map +1 -0
  70. package/dist/schemas/schemas.test.d.ts +2 -0
  71. package/dist/schemas/schemas.test.d.ts.map +1 -0
  72. package/dist/schemas/schemas.test.js +150 -0
  73. package/dist/schemas/schemas.test.js.map +1 -0
  74. package/dist/telescope.d.ts +135 -0
  75. package/dist/telescope.d.ts.map +1 -0
  76. package/dist/telescope.js +119 -0
  77. package/dist/telescope.js.map +1 -0
  78. package/dist/telescope.test.d.ts +2 -0
  79. package/dist/telescope.test.d.ts.map +1 -0
  80. package/dist/telescope.test.js +91 -0
  81. package/dist/telescope.test.js.map +1 -0
  82. package/dist/types.d.ts +9 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +2 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist/types.test-d.d.ts +2 -0
  87. package/dist/types.test-d.d.ts.map +1 -0
  88. package/dist/types.test-d.js +28 -0
  89. package/dist/types.test-d.js.map +1 -0
  90. package/package.json +60 -7
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Wonhee Lee
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,8 @@
1
+ import type { Coin, StdFee } from './types.js';
2
+ export interface CosmWasmQueryClient {
3
+ queryContractSmart(address: string, query: Record<string, unknown>): Promise<unknown>;
4
+ }
5
+ export interface CosmWasmExecuteClient<TExecuteResult = unknown> extends CosmWasmQueryClient {
6
+ execute(sender: string, address: string, msg: Record<string, unknown>, fee: StdFee | 'auto', memo?: string, funds?: readonly Coin[]): Promise<TExecuteResult>;
7
+ }
8
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,OAAO,CAAC,CAAA;CACpB;AAED,MAAM,WAAW,qBAAqB,CAAC,cAAc,GAAG,OAAO,CAC7D,SAAQ,mBAAmB;IAC3B,OAAO,CACL,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,GACtB,OAAO,CAAC,cAAc,CAAC,CAAA;CAC3B"}
package/dist/client.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test-d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test-d.d.ts","sourceRoot":"","sources":["../src/client.test-d.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { assertType, expectTypeOf, test } from 'vitest';
2
+ test('CosmWasmExecuteClient extends CosmWasmQueryClient', () => {
3
+ expectTypeOf().toExtend();
4
+ });
5
+ test('CosmWasmQueryClient.queryContractSmart signature', () => {
6
+ expectTypeOf().toBeFunction();
7
+ expectTypeOf().parameters.toEqualTypeOf();
8
+ expectTypeOf().returns.toEqualTypeOf();
9
+ });
10
+ test('CosmWasmExecuteClient.execute signature', () => {
11
+ expectTypeOf().toBeFunction();
12
+ // Verify it accepts the correct argument types
13
+ const mockClient = {
14
+ queryContractSmart: async () => ({}),
15
+ execute: async () => ({}),
16
+ };
17
+ const fee = {
18
+ amount: [{ denom: 'uosmo', amount: '500' }],
19
+ gas: '200000',
20
+ };
21
+ const funds = [{ denom: 'uosmo', amount: '1000' }];
22
+ // Valid calls
23
+ assertType(mockClient.execute('sender', 'contract', { transfer: {} }, fee));
24
+ assertType(mockClient.execute('sender', 'contract', { transfer: {} }, 'auto'));
25
+ assertType(mockClient.execute('sender', 'contract', { transfer: {} }, fee, 'memo', funds));
26
+ });
27
+ test('CosmWasmExecuteClient generic propagates execute result type', () => {
28
+ expectTypeOf().returns.toEqualTypeOf();
29
+ // queryContractSmart always returns unknown regardless of client
30
+ expectTypeOf().returns.toEqualTypeOf();
31
+ });
32
+ test('CosmWasmQueryClient is assignable from execute client', () => {
33
+ // An execute client should be usable anywhere a query client is expected
34
+ const execClient = {
35
+ queryContractSmart: async () => ({}),
36
+ execute: async () => ({}),
37
+ };
38
+ const queryClient = execClient;
39
+ assertType(queryClient);
40
+ });
41
+ //# sourceMappingURL=client.test-d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test-d.js","sourceRoot":"","sources":["../src/client.test-d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAIvD,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC7D,YAAY,EAAyB,CAAC,QAAQ,EAAuB,CAAA;AACvE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC5D,YAAY,EAA6C,CAAC,YAAY,EAAE,CAAA;IACxE,YAAY,EAET,CAAC,UAAU,CAAC,aAAa,EAEzB,CAAA;IACH,YAAY,EAET,CAAC,OAAO,CAAC,aAAa,EAAoB,CAAA;AAC/C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,YAAY,EAAoC,CAAC,YAAY,EAAE,CAAA;IAE/D,+CAA+C;IAC/C,MAAM,UAAU,GAA0B;QACxC,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAA;IAED,MAAM,GAAG,GAAW;QAClB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3C,GAAG,EAAE,QAAQ;KACd,CAAA;IACD,MAAM,KAAK,GAAoB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAEnE,cAAc;IACd,UAAU,CACR,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAChE,CAAA;IACD,UAAU,CACR,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CACnE,CAAA;IACD,UAAU,CACR,UAAU,CAAC,OAAO,CAChB,QAAQ,EACR,UAAU,EACV,EAAE,QAAQ,EAAE,EAAE,EAAE,EAChB,GAAG,EACH,MAAM,EACN,KAAK,CACN,CACF,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;IAIxE,YAAY,EAAqB,CAAC,OAAO,CAAC,aAAa,EAEpD,CAAA;IACH,iEAAiE;IACjE,YAAY,EAAgC,CAAC,OAAO,CAAC,aAAa,EAE/D,CAAA;AACL,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,yEAAyE;IACzE,MAAM,UAAU,GAA0B;QACxC,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAA;IACD,MAAM,WAAW,GAAwB,UAAU,CAAA;IACnD,UAAU,CAAsB,WAAW,CAAC,CAAA;AAC9C,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contract.bench-d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.bench-d.d.ts","sourceRoot":"","sources":["../src/contract.bench-d.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import { attest } from '@ark/attest';
2
+ import { describe, test } from 'vitest';
3
+ // ---------------------------------------------------------------------------
4
+ // FromSchema instantiation benchmarks
5
+ // ---------------------------------------------------------------------------
6
+ describe('FromSchema on CosmWasm schemas', () => {
7
+ test('cw20 execute schema (12 messages)', () => {
8
+ attest.instantiations([16458, 'instantiations']);
9
+ attest({});
10
+ });
11
+ test('cw20 query schema (9 messages)', () => {
12
+ attest.instantiations([811, 'instantiations']);
13
+ attest({});
14
+ });
15
+ });
16
+ // ---------------------------------------------------------------------------
17
+ // Message type extraction benchmarks
18
+ // ---------------------------------------------------------------------------
19
+ describe('Message type extraction', () => {
20
+ test('extract message names from execute union', () => {
21
+ attest.instantiations([74, 'instantiations']);
22
+ attest({});
23
+ });
24
+ test('extract transfer args', () => {
25
+ attest.instantiations([74, 'instantiations']);
26
+ attest({});
27
+ });
28
+ });
29
+ // ---------------------------------------------------------------------------
30
+ // Response schema resolution benchmarks
31
+ // ---------------------------------------------------------------------------
32
+ describe('Response schema resolution (lazy FromSchema)', () => {
33
+ test('resolve balance response', () => {
34
+ attest.instantiations([1115, 'instantiations']);
35
+ attest({});
36
+ });
37
+ test('resolve token_info response', () => {
38
+ attest.instantiations([1488, 'instantiations']);
39
+ attest({});
40
+ });
41
+ test('resolve allowance response', () => {
42
+ attest.instantiations([28809, 'instantiations']);
43
+ attest({});
44
+ });
45
+ });
46
+ // ---------------------------------------------------------------------------
47
+ // Full contract type construction benchmarks
48
+ // ---------------------------------------------------------------------------
49
+ describe('TypedContract construction', () => {
50
+ test('TypedQueryContract without responses', () => {
51
+ attest.instantiations([69, 'instantiations']);
52
+ attest({});
53
+ });
54
+ test('TypedQueryContract with responses', () => {
55
+ attest.instantiations([139, 'instantiations']);
56
+ attest({});
57
+ });
58
+ test('TypedContract without responses', () => {
59
+ attest.instantiations([60, 'instantiations']);
60
+ attest({});
61
+ });
62
+ test('TypedContract with responses', () => {
63
+ attest.instantiations([142, 'instantiations']);
64
+ attest({});
65
+ });
66
+ });
67
+ //# sourceMappingURL=contract.bench-d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.bench-d.js","sourceRoot":"","sources":["../src/contract.bench-d.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { FromSchema, JSONSchema } from 'json-schema-to-ts';
2
+ import type { CosmWasmExecuteClient, CosmWasmQueryClient } from './client.js';
3
+ import type { Coin, StdFee } from './types.js';
4
+ /** Extract all top-level keys from a union of single-key objects. */
5
+ type MessageNames<T> = T extends Record<string, unknown> ? keyof T & string : never;
6
+ /** Extract the value type for a specific key from a union. */
7
+ type MessageArgs<T, K extends string> = T extends Record<K, infer V> ? V : never;
8
+ export interface TypedQueryContract<TQueryMsg, TResponses extends Record<string, JSONSchema> | undefined = undefined> {
9
+ query<K extends MessageNames<TQueryMsg>>(msg: K, args: MessageArgs<TQueryMsg, K>): Promise<TResponses extends Record<string, JSONSchema> ? K extends keyof TResponses ? FromSchema<TResponses[K]> : unknown : unknown>;
10
+ }
11
+ export interface TypedContract<TExecuteMsg, TQueryMsg, TExecuteResult = unknown, TResponses extends Record<string, JSONSchema> | undefined = undefined> extends TypedQueryContract<TQueryMsg, TResponses> {
12
+ execute<K extends MessageNames<TExecuteMsg>>(sender: string, msg: K, args: MessageArgs<TExecuteMsg, K>, fee: StdFee | 'auto', memo?: string, funds?: readonly Coin[]): Promise<TExecuteResult>;
13
+ }
14
+ /** Full contract with execute + query. */
15
+ export declare function createTypedContract<const TExecuteSchema extends JSONSchema, const TQuerySchema extends JSONSchema, const TResponses extends Record<string, JSONSchema> | undefined = undefined, TExecuteResult = unknown>(client: CosmWasmExecuteClient<TExecuteResult>, contractAddress: string, schemas: {
16
+ execute: TExecuteSchema;
17
+ query: TQuerySchema;
18
+ responses?: TResponses;
19
+ }): TypedContract<FromSchema<TExecuteSchema>, FromSchema<TQuerySchema>, TExecuteResult, TResponses>;
20
+ /** Query-only contract (no execute capability). */
21
+ export declare function createTypedContract<const TQuerySchema extends JSONSchema, const TResponses extends Record<string, JSONSchema> | undefined = undefined>(client: CosmWasmQueryClient, contractAddress: string, schemas: {
22
+ execute?: never;
23
+ query: TQuerySchema;
24
+ responses?: TResponses;
25
+ }): TypedQueryContract<FromSchema<TQuerySchema>, TResponses>;
26
+ export {};
27
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Ajv } from 'ajv';
2
+ /** Implementation. */
3
+ export function createTypedContract(client, contractAddress, schemas) {
4
+ const ajv = new Ajv({ validateFormats: false });
5
+ const validateQuery = ajv.compile(schemas.query);
6
+ const validateExecute = schemas.execute
7
+ ? ajv.compile(schemas.execute)
8
+ : undefined;
9
+ const contract = {
10
+ async query(msg, args) {
11
+ const envelope = { [msg]: args };
12
+ if (!validateQuery(envelope)) {
13
+ throw new Error(`Query validation failed for "${msg}": ${ajv.errorsText(validateQuery.errors)}`);
14
+ }
15
+ return client.queryContractSmart(contractAddress, envelope);
16
+ },
17
+ };
18
+ if (schemas.execute && validateExecute) {
19
+ const execClient = client;
20
+ contract.execute = async (sender, msg, args, fee, memo, funds) => {
21
+ const envelope = { [msg]: args };
22
+ if (!validateExecute(envelope)) {
23
+ throw new Error(`Execute validation failed for "${msg}": ${ajv.errorsText(validateExecute.errors)}`);
24
+ }
25
+ return execClient.execute(sender, contractAddress, envelope, fee, memo, funds);
26
+ };
27
+ }
28
+ return contract;
29
+ }
30
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AA2FzB,sBAAsB;AACtB,MAAM,UAAU,mBAAmB,CACjC,MAA2B,EAC3B,eAAuB,EACvB,OAIC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAA;IAE/C,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAA;IAC3E,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO;QACrC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAkC,CAAC;QACzD,CAAC,CAAC,SAAS,CAAA;IAEb,MAAM,QAAQ,GAA4B;QACxC,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,IAAa;YACpC,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAA;YAChC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CACb,gCAAgC,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAChF,CAAA;YACH,CAAC;YACD,OAAO,MAAM,CAAC,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;QAC7D,CAAC;KACF,CAAA;IAED,IAAI,OAAO,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,MAA+B,CAAA;QAClD,QAAQ,CAAC,OAAO,GAAG,KAAK,EACtB,MAAc,EACd,GAAW,EACX,IAAa,EACb,GAAoB,EACpB,IAAa,EACb,KAAuB,EACvB,EAAE;YACF,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAA;YAChC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CACb,kCAAkC,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CACpF,CAAA;YACH,CAAC;YACD,OAAO,UAAU,CAAC,OAAO,CACvB,MAAM,EACN,eAAe,EACf,QAAQ,EACR,GAAG,EACH,IAAI,EACJ,KAAK,CACN,CAAA;QACH,CAAC,CAAA;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contract.test-d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.test-d.d.ts","sourceRoot":"","sources":["../src/contract.test-d.ts"],"names":[],"mappings":""}
@@ -0,0 +1,147 @@
1
+ import { assertType, expectTypeOf, test } from 'vitest';
2
+ import { createTypedContract } from './contract.js';
3
+ // ---------------------------------------------------------------------------
4
+ // Test: FromSchema produces correct message union
5
+ // ---------------------------------------------------------------------------
6
+ test('ExecuteMsg is a union of single-key objects', () => {
7
+ assertType({
8
+ transfer: { amount: '1000', recipient: 'osmo1abc' },
9
+ });
10
+ assertType({ burn: { amount: '500' } });
11
+ assertType({
12
+ send: { amount: '100', contract: 'osmo1xyz', msg: 'base64' },
13
+ });
14
+ assertType({
15
+ mint: { amount: '2000', recipient: 'osmo1def' },
16
+ });
17
+ });
18
+ test('ExecuteMsg rejects invalid message name', () => {
19
+ // @ts-expect-error - 'xfer' is not a valid execute message name
20
+ assertType({ xfer: {} });
21
+ });
22
+ test('ExecuteMsg rejects typo in field name', () => {
23
+ assertType({
24
+ // @ts-expect-error - 'recipent' is a typo
25
+ transfer: { amount: '1000', recipent: 'osmo1abc' },
26
+ });
27
+ });
28
+ test('ExecuteMsg rejects missing required field', () => {
29
+ // @ts-expect-error - missing 'recipient'
30
+ assertType({ transfer: { amount: '1000' } });
31
+ });
32
+ test('QueryMsg is a union of single-key objects', () => {
33
+ assertType({ balance: { address: 'osmo1abc' } });
34
+ assertType({ token_info: {} });
35
+ assertType({
36
+ allowance: { owner: 'osmo1abc', spender: 'osmo1def' },
37
+ });
38
+ });
39
+ test('QueryMsg rejects invalid query name', () => {
40
+ // @ts-expect-error - 'balances' is not a valid query name
41
+ assertType({ balances: { address: 'osmo1abc' } });
42
+ });
43
+ test('QueryMsg rejects missing required field', () => {
44
+ // @ts-expect-error - missing 'address'
45
+ assertType({ balance: {} });
46
+ });
47
+ test('full contract has execute and query methods', () => {
48
+ expectTypeOf().toHaveProperty('execute');
49
+ expectTypeOf().toHaveProperty('query');
50
+ });
51
+ test('query-only contract has query but not execute', () => {
52
+ expectTypeOf().toHaveProperty('query');
53
+ expectTypeOf().not.toHaveProperty('execute');
54
+ });
55
+ test('execute return type is Promise<unknown>', () => {
56
+ expectTypeOf().toEqualTypeOf();
57
+ });
58
+ test('query return type is Promise<unknown>', () => {
59
+ expectTypeOf().toEqualTypeOf();
60
+ });
61
+ // ---------------------------------------------------------------------------
62
+ // Test: createTypedContract overload resolution
63
+ // ---------------------------------------------------------------------------
64
+ test('createTypedContract with execute+query returns TypedContract', () => {
65
+ const client = {
66
+ queryContractSmart: async () => ({}),
67
+ execute: async () => ({}),
68
+ };
69
+ const contract = createTypedContract(client, 'addr', {
70
+ execute: {},
71
+ query: {},
72
+ });
73
+ expectTypeOf(contract).toHaveProperty('execute');
74
+ expectTypeOf(contract).toHaveProperty('query');
75
+ });
76
+ test('createTypedContract with query-only returns TypedQueryContract', () => {
77
+ const queryClient = {
78
+ queryContractSmart: async () => ({}),
79
+ };
80
+ const contract = createTypedContract(queryClient, 'addr', {
81
+ query: {},
82
+ });
83
+ expectTypeOf(contract).toHaveProperty('query');
84
+ expectTypeOf(contract).not.toHaveProperty('execute');
85
+ });
86
+ // ---------------------------------------------------------------------------
87
+ // Test: createTypedContract infers result types from client generics
88
+ // ---------------------------------------------------------------------------
89
+ test('execute result type is inferred from client', () => {
90
+ const client = {
91
+ queryContractSmart: async () => ({}),
92
+ execute: async () => ({ transactionHash: 'abc' }),
93
+ };
94
+ const contract = createTypedContract(client, 'addr', {
95
+ execute: {},
96
+ query: {},
97
+ });
98
+ // Call with a specific message name to resolve the generic K
99
+ const result = contract.execute('sender', 'transfer', { amount: '100', recipient: 'osmo1abc' }, 'auto');
100
+ expectTypeOf(result).toEqualTypeOf();
101
+ const queryResult = contract.query('balance', { address: 'osmo1abc' });
102
+ expectTypeOf(queryResult).toEqualTypeOf();
103
+ });
104
+ // ---------------------------------------------------------------------------
105
+ // Test: query response typing with responses schema
106
+ // ---------------------------------------------------------------------------
107
+ test('query returns typed response when responses provided', () => {
108
+ const responseSchemas = {
109
+ balance: {
110
+ type: 'object',
111
+ required: ['balance'],
112
+ properties: { balance: { type: 'string' } },
113
+ additionalProperties: false,
114
+ },
115
+ token_info: {
116
+ type: 'object',
117
+ required: ['name', 'symbol'],
118
+ properties: {
119
+ name: { type: 'string' },
120
+ symbol: { type: 'string' },
121
+ },
122
+ additionalProperties: false,
123
+ },
124
+ };
125
+ const queryClient = {
126
+ queryContractSmart: async () => ({}),
127
+ };
128
+ const contract = createTypedContract(queryClient, 'addr', {
129
+ query: {},
130
+ responses: responseSchemas,
131
+ });
132
+ const balanceResult = contract.query('balance', { address: 'osmo1abc' });
133
+ expectTypeOf(balanceResult).toEqualTypeOf();
134
+ const tokenInfoResult = contract.query('token_info', {});
135
+ expectTypeOf(tokenInfoResult).toEqualTypeOf();
136
+ });
137
+ test('query returns unknown when no responses provided', () => {
138
+ const queryClient = {
139
+ queryContractSmart: async () => ({}),
140
+ };
141
+ const contract = createTypedContract(queryClient, 'addr', {
142
+ query: {},
143
+ });
144
+ const result = contract.query('balance', { address: 'osmo1abc' });
145
+ expectTypeOf(result).toEqualTypeOf();
146
+ });
147
+ //# sourceMappingURL=contract.test-d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.test-d.js","sourceRoot":"","sources":["../src/contract.test-d.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.test.d.ts","sourceRoot":"","sources":["../src/contract.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,77 @@
1
+ import { describe, expect, test, vi } from 'vitest';
2
+ import { createTypedContract } from './contract.js';
3
+ import { cw20ExecuteSchema, cw20QuerySchema } from './schemas/cw20/index.js';
4
+ function createMockExecuteClient() {
5
+ return {
6
+ queryContractSmart: vi.fn().mockResolvedValue({ balance: '1000' }),
7
+ execute: vi.fn().mockResolvedValue({ transactionHash: 'abc123' }),
8
+ };
9
+ }
10
+ function createMockQueryClient() {
11
+ return {
12
+ queryContractSmart: vi.fn().mockResolvedValue({ balance: '1000' }),
13
+ };
14
+ }
15
+ describe('createTypedContract (execute + query)', () => {
16
+ const mockClient = createMockExecuteClient();
17
+ const cw20 = createTypedContract(mockClient, 'osmo1contract', {
18
+ execute: cw20ExecuteSchema,
19
+ query: cw20QuerySchema,
20
+ });
21
+ test('execute passes valid args to client with correct envelope', async () => {
22
+ await cw20.execute('osmo1sender', 'transfer', { amount: '1000', recipient: 'osmo1recipient' }, 'auto');
23
+ expect(mockClient.execute).toHaveBeenCalledWith('osmo1sender', 'osmo1contract', { transfer: { amount: '1000', recipient: 'osmo1recipient' } }, 'auto', undefined, undefined);
24
+ });
25
+ test('execute passes memo and funds to client', async () => {
26
+ const fee = { amount: [{ denom: 'uosmo', amount: '500' }], gas: '200000' };
27
+ const funds = [{ denom: 'uosmo', amount: '100' }];
28
+ await cw20.execute('osmo1sender', 'burn', { amount: '500' }, fee, 'test memo', funds);
29
+ expect(mockClient.execute).toHaveBeenCalledWith('osmo1sender', 'osmo1contract', { burn: { amount: '500' } }, fee, 'test memo', funds);
30
+ });
31
+ test('execute throws on missing required field', async () => {
32
+ await expect(
33
+ // @ts-expect-error - testing runtime validation with invalid args
34
+ cw20.execute('osmo1sender', 'transfer', { amount: '1000' }, 'auto')).rejects.toThrow('Execute validation failed for "transfer"');
35
+ });
36
+ test('execute throws on wrong type for $ref Uint128 (number instead of string)', async () => {
37
+ await expect(cw20.execute('osmo1sender', 'transfer',
38
+ // @ts-expect-error - testing runtime: amount should be string
39
+ { amount: 1000, recipient: 'osmo1abc' }, 'auto')).rejects.toThrow('Execute validation failed for "transfer"');
40
+ });
41
+ test('execute validates $ref correctly (Uint128 as string passes)', async () => {
42
+ await cw20.execute('osmo1sender', 'mint', { amount: '999', recipient: 'osmo1abc' }, 'auto');
43
+ expect(mockClient.execute).toHaveBeenCalledWith('osmo1sender', 'osmo1contract', { mint: { amount: '999', recipient: 'osmo1abc' } }, 'auto', undefined, undefined);
44
+ });
45
+ test('execute rejects additional properties', async () => {
46
+ await expect(cw20.execute('osmo1sender', 'burn',
47
+ // @ts-expect-error - testing runtime: extra field
48
+ { amount: '500', extraField: true }, 'auto')).rejects.toThrow('Execute validation failed for "burn"');
49
+ });
50
+ test('query passes valid args to client with correct envelope', async () => {
51
+ await cw20.query('balance', { address: 'osmo1abc' });
52
+ expect(mockClient.queryContractSmart).toHaveBeenCalledWith('osmo1contract', { balance: { address: 'osmo1abc' } });
53
+ });
54
+ test('query throws on missing required field', async () => {
55
+ await expect(
56
+ // @ts-expect-error - testing runtime validation
57
+ cw20.query('balance', {})).rejects.toThrow('Query validation failed for "balance"');
58
+ });
59
+ test('query with empty args works for token_info', async () => {
60
+ await cw20.query('token_info', {});
61
+ expect(mockClient.queryContractSmart).toHaveBeenCalledWith('osmo1contract', { token_info: {} });
62
+ });
63
+ });
64
+ describe('createTypedContract (query-only)', () => {
65
+ const mockClient = createMockQueryClient();
66
+ const cw20 = createTypedContract(mockClient, 'osmo1contract', {
67
+ query: cw20QuerySchema,
68
+ });
69
+ test('query works on query-only contract', async () => {
70
+ await cw20.query('balance', { address: 'osmo1abc' });
71
+ expect(mockClient.queryContractSmart).toHaveBeenCalledWith('osmo1contract', { balance: { address: 'osmo1abc' } });
72
+ });
73
+ test('query-only contract does not have execute method', () => {
74
+ expect('execute' in cw20).toBe(false);
75
+ });
76
+ });
77
+ //# sourceMappingURL=contract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.test.js","sourceRoot":"","sources":["../src/contract.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAE5E,SAAS,uBAAuB;IAC9B,OAAO;QACL,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAClE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;KAClE,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;QACL,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KACnE,CAAA;AACH,CAAC;AAED,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,MAAM,UAAU,GAAG,uBAAuB,EAAE,CAAA;IAC5C,MAAM,IAAI,GAAG,mBAAmB,CAAC,UAAU,EAAE,eAAe,EAAE;QAC5D,OAAO,EAAE,iBAAiB;QAC1B,KAAK,EAAE,eAAe;KACvB,CAAC,CAAA;IAEF,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,IAAI,CAAC,OAAO,CAChB,aAAa,EACb,UAAU,EACV,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAC/C,MAAM,CACP,CAAA;QAED,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAC7C,aAAa,EACb,eAAe,EACf,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,EAC7D,MAAM,EACN,SAAS,EACT,SAAS,CACV,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;QAC1E,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAU,CAAA;QAE1D,MAAM,IAAI,CAAC,OAAO,CAChB,aAAa,EACb,MAAM,EACN,EAAE,MAAM,EAAE,KAAK,EAAE,EACjB,GAAG,EACH,WAAW,EACX,KAAK,CACN,CAAA;QAED,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAC7C,aAAa,EACb,eAAe,EACf,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAC3B,GAAG,EACH,WAAW,EACX,KAAK,CACN,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM;QACV,kEAAkE;QAClE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CACpE,CAAC,OAAO,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,MAAM,CACV,IAAI,CAAC,OAAO,CACV,aAAa,EACb,UAAU;QACV,8DAA8D;QAC9D,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EACvC,MAAM,CACP,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,IAAI,CAAC,OAAO,CAChB,aAAa,EACb,MAAM,EACN,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,EACxC,MAAM,CACP,CAAA;QAED,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAC7C,aAAa,EACb,eAAe,EACf,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAClD,MAAM,EACN,SAAS,EACT,SAAS,CACV,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,CACV,IAAI,CAAC,OAAO,CACV,aAAa,EACb,MAAM;QACN,kDAAkD;QAClD,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EACnC,MAAM,CACP,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAA;QAEpD,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CACxD,eAAe,EACf,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CACrC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM;QACV,gDAAgD;QAChD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAC1B,CAAC,OAAO,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QAElC,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CACxD,eAAe,EACf,EAAE,UAAU,EAAE,EAAE,EAAE,CACnB,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,MAAM,UAAU,GAAG,qBAAqB,EAAE,CAAA;IAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAC,UAAU,EAAE,eAAe,EAAE;QAC5D,KAAK,EAAE,eAAe;KACvB,CAAC,CAAA;IAEF,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAA;QAEpD,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CACxD,eAAe,EACf,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CACrC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export type { CosmWasmExecuteClient, CosmWasmQueryClient } from './client.js';
2
+ export type { TypedContract, TypedQueryContract } from './contract.js';
3
+ export { createTypedContract } from './contract.js';
4
+ export type { Coin, StdFee } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC7E,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { createTypedContract } from './contract.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA"}