@pasosdejesus/m 0.22.1 → 0.22.2

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 (47) hide show
  1. package/package.json +3 -2
  2. package/dist/base-model/baseline.generated.d.ts +0 -60
  3. package/dist/base-model/baseline.generated.d.ts.map +0 -1
  4. package/dist/base-model/baseline.generated.js +0 -1110
  5. package/dist/base-model/baseline.generated.js.map +0 -1
  6. package/dist/base-model/check.d.ts +0 -6
  7. package/dist/base-model/check.d.ts.map +0 -1
  8. package/dist/base-model/check.js +0 -195
  9. package/dist/base-model/check.js.map +0 -1
  10. package/dist/base-model/generate.d.ts +0 -37
  11. package/dist/base-model/generate.d.ts.map +0 -1
  12. package/dist/base-model/generate.js +0 -184
  13. package/dist/base-model/generate.js.map +0 -1
  14. package/dist/base-model/guidelines.d.ts +0 -13
  15. package/dist/base-model/guidelines.d.ts.map +0 -1
  16. package/dist/base-model/guidelines.js +0 -61
  17. package/dist/base-model/guidelines.js.map +0 -1
  18. package/dist/base-model/index.d.ts +0 -19
  19. package/dist/base-model/index.d.ts.map +0 -1
  20. package/dist/base-model/index.js +0 -22
  21. package/dist/base-model/index.js.map +0 -1
  22. package/dist/base-model/parse-structure.d.ts +0 -4
  23. package/dist/base-model/parse-structure.d.ts.map +0 -1
  24. package/dist/base-model/parse-structure.js +0 -170
  25. package/dist/base-model/parse-structure.js.map +0 -1
  26. package/dist/base-model/queries.d.ts +0 -41
  27. package/dist/base-model/queries.d.ts.map +0 -1
  28. package/dist/base-model/queries.js +0 -157
  29. package/dist/base-model/queries.js.map +0 -1
  30. package/dist/base-model/references/learn-tg.d.ts +0 -16
  31. package/dist/base-model/references/learn-tg.d.ts.map +0 -1
  32. package/dist/base-model/references/learn-tg.js +0 -60
  33. package/dist/base-model/references/learn-tg.js.map +0 -1
  34. package/dist/base-model/types.d.ts +0 -183
  35. package/dist/base-model/types.d.ts.map +0 -1
  36. package/dist/base-model/types.js +0 -10
  37. package/dist/base-model/types.js.map +0 -1
  38. package/dist/base-model/version.d.ts +0 -12
  39. package/dist/base-model/version.d.ts.map +0 -1
  40. package/dist/base-model/version.js +0 -20
  41. package/dist/base-model/version.js.map +0 -1
  42. package/dist/tasks/base-model.d.ts +0 -3
  43. package/dist/tasks/base-model.d.ts.map +0 -1
  44. package/dist/tasks/base-model.js +0 -177
  45. package/dist/tasks/base-model.js.map +0 -1
  46. package/dist/templates/apps/hardhat/contracts/MockUSDT.sol +0 -47
  47. package/dist/templates/apps/hardhat/test/MockUSDT.test.ts +0 -40
@@ -1,183 +0,0 @@
1
- /**
2
- * Types of the base model (learn.tg REQ/260, Part A in `m`).
3
- *
4
- * The DB handle is injected through `SqlExecutor`: `m` never creates a
5
- * connection and never depends on a query builder at runtime (decision D3).
6
- * Consumers can pass a `pg` Pool/Client (its `query(text, values)` already has
7
- * this shape) or a small adapter over Kysely's `executeQuery`.
8
- */
9
- export interface SqlExecutor {
10
- query<R = Record<string, unknown>>(text: string, params?: unknown[]): Promise<{
11
- rows: R[];
12
- }>;
13
- }
14
- export interface ColumnSpec {
15
- name: string;
16
- type: string;
17
- notNull: boolean;
18
- default?: string;
19
- }
20
- export interface ConstraintSpec {
21
- name: string;
22
- kind: 'primary-key' | 'unique' | 'foreign-key' | 'check';
23
- definition: string;
24
- columns: string[];
25
- references?: {
26
- table: string;
27
- columns: string[];
28
- };
29
- }
30
- export interface TableSpec {
31
- name: string;
32
- columns: ColumnSpec[];
33
- constraints: ConstraintSpec[];
34
- }
35
- export interface SequenceSpec {
36
- name: string;
37
- definition: string;
38
- ownedBy?: {
39
- table: string;
40
- column: string;
41
- };
42
- }
43
- export interface ServerDefaultSpec {
44
- table: string;
45
- column: string;
46
- default: string;
47
- }
48
- export interface IndexSpec {
49
- name: string;
50
- table: string;
51
- unique: boolean;
52
- definition: string;
53
- }
54
- export interface ParsedStructure {
55
- tables: Record<string, TableSpec>;
56
- sequences: Record<string, SequenceSpec>;
57
- serverDefaults: ServerDefaultSpec[];
58
- indexes: IndexSpec[];
59
- }
60
- export interface BaselineInventory {
61
- version: string;
62
- tables: Record<string, {
63
- columns: Record<string, ColumnSpec>;
64
- constraints: ConstraintSpec[];
65
- }>;
66
- counts: Record<string, number>;
67
- }
68
- export interface BaselineExtensions {
69
- /** "table.column" entries that belong to the consumer, not to the base. */
70
- columns: string[];
71
- /** "table.constraint" entries that belong to the consumer. */
72
- constraints: string[];
73
- }
74
- export type CheckGrade = 'drift' | 'absent' | 'extra';
75
- export interface CheckFinding {
76
- table: string;
77
- column?: string;
78
- constraint?: string;
79
- grade: CheckGrade;
80
- detail: string;
81
- }
82
- export interface CheckReport {
83
- ok: boolean;
84
- baseModelVersion: string;
85
- findings: CheckFinding[];
86
- tablesChecked: number;
87
- tablesAbsent: string[];
88
- summary: {
89
- drift: number;
90
- absent: number;
91
- extra: number;
92
- };
93
- }
94
- /** Base columns of the learner (groups A and B of the upstream annex). */
95
- export interface UsuarioBase {
96
- id: number;
97
- nusuario: string;
98
- nombre?: string | null;
99
- descripcion?: string | null;
100
- email: string;
101
- rol?: number | null;
102
- idioma?: string | null;
103
- pais_id?: number | null;
104
- religion_id?: number | null;
105
- oficina_id?: number | null;
106
- tema_id?: number | null;
107
- fechacreacion: string;
108
- fechadeshabilitacion?: string | null;
109
- created_at?: string | null;
110
- updated_at?: string | null;
111
- [extension: string]: unknown;
112
- }
113
- /** Legacy columns kept for the Rails backoffice; `m` types but never writes them. */
114
- export interface UsuarioLegacy {
115
- password?: string;
116
- encrypted_password?: string;
117
- reset_password_token?: string | null;
118
- sign_in_count?: number;
119
- failed_attempts?: number;
120
- unlock_token?: string | null;
121
- locked_at?: string | null;
122
- }
123
- export interface Usuario extends UsuarioBase, UsuarioLegacy {
124
- }
125
- export interface BilleteraUsuario {
126
- id: number;
127
- billetera: string;
128
- usuario_id: number;
129
- created_at: string;
130
- updated_at: string;
131
- [extension: string]: unknown;
132
- }
133
- export interface Pais {
134
- id: number;
135
- nombre: string;
136
- alfa2?: string | null;
137
- alfa3?: string | null;
138
- fechacreacion?: string | null;
139
- fechadeshabilitacion?: string | null;
140
- [extension: string]: unknown;
141
- }
142
- export interface Departamento extends Pais {
143
- }
144
- export interface Municipio {
145
- id: number;
146
- nombre: string;
147
- departamento_id?: number | null;
148
- pais_id?: number | null;
149
- fechacreacion?: string | null;
150
- fechadeshabilitacion?: string | null;
151
- [extension: string]: unknown;
152
- }
153
- export interface CentroPoblado {
154
- id: number;
155
- nombre: string;
156
- municipio_id?: number | null;
157
- departamento_id?: number | null;
158
- pais_id?: number | null;
159
- fechacreacion?: string | null;
160
- fechadeshabilitacion?: string | null;
161
- [extension: string]: unknown;
162
- }
163
- export interface VisibilityConfig {
164
- /** Column that marks a row as publicly visible (e.g. `mostrar_cursos_publico`). */
165
- columns: string[];
166
- /** Value that means "public"; defaults to boolean true. */
167
- publicValue?: unknown;
168
- }
169
- export interface GeoCascadeQuery {
170
- q?: string;
171
- municipalityId?: number;
172
- departamentoId?: number;
173
- limit?: number;
174
- }
175
- export interface TownResult {
176
- id: number;
177
- nombre: string;
178
- municipio_id?: number | null;
179
- municipio?: string | null;
180
- departamento?: string | null;
181
- pais?: string | null;
182
- }
183
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/base-model/types.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Types of the base model (learn.tg REQ/260, Part A in `m`).
3
- *
4
- * The DB handle is injected through `SqlExecutor`: `m` never creates a
5
- * connection and never depends on a query builder at runtime (decision D3).
6
- * Consumers can pass a `pg` Pool/Client (its `query(text, values)` already has
7
- * this shape) or a small adapter over Kysely's `executeQuery`.
8
- */
9
- export {};
10
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/base-model/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Base model version published by `m`.
3
- *
4
- * Independent from `@pasosdejesus/m`'s own version: a change in the base
5
- * columns is breaking for consumers even when `m`'s API does not change, so it
6
- * has its own axis (learn.tg REQ/260, decision D1).
7
- */
8
- export declare const BASE_MODEL_VERSION = "1.0.0";
9
- export declare const BASE_MODEL_TABLES: readonly ["usuario", "billetera_usuario", "msip_pais", "msip_departamento", "msip_municipio", "msip_centropoblado"];
10
- export type BaseModelTable = (typeof BASE_MODEL_TABLES)[number];
11
- export declare function isBaseModelTable(name: string): name is BaseModelTable;
12
- //# sourceMappingURL=version.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/base-model/version.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,eAAO,MAAM,iBAAiB,qHAOpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,cAAc,CAErE"}
@@ -1,20 +0,0 @@
1
- /**
2
- * Base model version published by `m`.
3
- *
4
- * Independent from `@pasosdejesus/m`'s own version: a change in the base
5
- * columns is breaking for consumers even when `m`'s API does not change, so it
6
- * has its own axis (learn.tg REQ/260, decision D1).
7
- */
8
- export const BASE_MODEL_VERSION = '1.0.0';
9
- export const BASE_MODEL_TABLES = [
10
- 'usuario',
11
- 'billetera_usuario',
12
- 'msip_pais',
13
- 'msip_departamento',
14
- 'msip_municipio',
15
- 'msip_centropoblado',
16
- ];
17
- export function isBaseModelTable(name) {
18
- return BASE_MODEL_TABLES.includes(name);
19
- }
20
- //# sourceMappingURL=version.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/base-model/version.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS;IACT,mBAAmB;IACnB,WAAW;IACX,mBAAmB;IACnB,gBAAgB;IAChB,oBAAoB;CACZ,CAAC;AAIX,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAQ,iBAAuC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC"}
@@ -1,3 +0,0 @@
1
- export declare function runBaseModelDump(): Promise<void>;
2
- export declare function runBaseModelVerify(): Promise<void>;
3
- //# sourceMappingURL=base-model.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/tasks/base-model.ts"],"names":[],"mappings":"AAoLA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOtD;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOxD"}
@@ -1,177 +0,0 @@
1
- import { readFileSync, writeFileSync } from 'node:fs';
2
- import { createHash } from 'node:crypto';
3
- import { spawnSync } from 'node:child_process';
4
- import { info, success, warn, problem } from '../util/colors.js';
5
- import { parseFlags } from '../util/cli-parser.js';
6
- import { BASE_MODEL_VERSION } from '../base-model/version.js';
7
- import { parseStructureSql } from '../base-model/parse-structure.js';
8
- import { buildBaseline, buildInventory, renderGeneratedModule } from '../base-model/generate.js';
9
- import { LEARN_TG_EXTENSIONS } from '../base-model/references/learn-tg.js';
10
- import { BASELINE_INVENTORY } from '../base-model/baseline.generated.js';
11
- const FLAGS = {
12
- 'from-structure': { type: 'string' },
13
- 'from-db': { type: 'boolean' },
14
- 'extensions': { type: 'string' },
15
- 'out': { type: 'string' },
16
- 'print': { type: 'boolean' },
17
- 'kept': { type: 'boolean' },
18
- };
19
- function readOptions() {
20
- const { options } = parseFlags(process.argv.slice(3), FLAGS);
21
- return {
22
- fromStructure: options['from-structure'],
23
- fromDb: Boolean(options['from-db']),
24
- extensions: options['extensions'],
25
- out: options['out'],
26
- print: Boolean(options['print']),
27
- kept: Boolean(options['kept']),
28
- };
29
- }
30
- function readReference(options) {
31
- if (options.fromStructure) {
32
- return { sql: readFileSync(options.fromStructure, 'utf-8'), source: options.fromStructure };
33
- }
34
- if (options.fromDb) {
35
- const database = process.env.PGDATABASE;
36
- if (!database)
37
- throw new Error('--from-db needs PGDATABASE (or use --from-structure <file>)');
38
- const result = spawnSync('pg_dump', ['--schema-only', '--no-owner', '--no-privileges', database], {
39
- encoding: 'utf-8',
40
- stdio: ['ignore', 'pipe', 'pipe'],
41
- });
42
- if (result.status !== 0)
43
- throw new Error(`pg_dump failed: ${(result.stderr ?? '').toString().trim()}`);
44
- return { sql: result.stdout, source: `pg_dump ${database}` };
45
- }
46
- throw new Error('Missing reference: use --from-structure <structure.sql> or --from-db');
47
- }
48
- function readExtensions(options) {
49
- if (!options.extensions)
50
- return { extensions: LEARN_TG_EXTENSIONS, source: 'built-in learn-tg reference' };
51
- return { extensions: JSON.parse(readFileSync(options.extensions, 'utf-8')), source: options.extensions };
52
- }
53
- function keptColumns(inventory, table) {
54
- return Object.keys(inventory.tables[table]?.columns ?? {});
55
- }
56
- function diffInventories(base, other) {
57
- const diffs = [];
58
- for (const [table, tableSpec] of Object.entries(base.tables)) {
59
- const otherTable = other.tables[table];
60
- if (!otherTable) {
61
- diffs.push({ table, onlyInBase: Object.keys(tableSpec.columns), onlyInOther: [] });
62
- continue;
63
- }
64
- const baseColumns = Object.keys(tableSpec.columns);
65
- const otherColumns = Object.keys(otherTable.columns);
66
- const onlyInBase = baseColumns.filter((column) => !otherColumns.includes(column));
67
- const onlyInOther = otherColumns.filter((column) => !baseColumns.includes(column));
68
- const baseConstraints = tableSpec.constraints.map((constraint) => constraint.name);
69
- const otherConstraints = otherTable.constraints.map((constraint) => constraint.name);
70
- const missingConstraints = baseConstraints.filter((name) => !otherConstraints.includes(name));
71
- const extraConstraints = otherConstraints.filter((name) => !baseConstraints.includes(name));
72
- if (onlyInBase.length > 0 || onlyInOther.length > 0 || missingConstraints.length > 0 || extraConstraints.length > 0) {
73
- diffs.push({
74
- table,
75
- onlyInBase: [...onlyInBase, ...missingConstraints.map((name) => `constraint:${name}`)],
76
- onlyInOther: [...onlyInOther, ...extraConstraints.map((name) => `constraint:${name}`)],
77
- });
78
- }
79
- }
80
- return diffs;
81
- }
82
- async function runDump() {
83
- const options = readOptions();
84
- const say = options.print ? (message) => process.stderr.write(message + '\n') : info;
85
- const sayWarn = options.print ? (message) => process.stderr.write(message + '\n') : warn;
86
- const reference = readReference(options);
87
- const { extensions, source: extensionsSource } = readExtensions(options);
88
- const sha256 = createHash('sha256').update(reference.sql).digest('hex');
89
- const parsed = parseStructureSql(reference.sql);
90
- const baseline = buildBaseline({
91
- parsed,
92
- extensions,
93
- version: BASE_MODEL_VERSION,
94
- reference: { source: reference.source, sha256 },
95
- });
96
- for (const table of Object.keys(BASELINE_INVENTORY.tables)) {
97
- if (!parsed.tables[table])
98
- sayWarn(`[WARN] reference has no table "${table}"`);
99
- }
100
- for (const entry of extensions.columns) {
101
- const [table, column] = entry.split('.');
102
- if (!parsed.tables[table]?.columns.some((candidate) => candidate.name === column)) {
103
- sayWarn(`[WARN] declared extension not in the reference: ${entry}`);
104
- }
105
- }
106
- say(`Base model ${BASE_MODEL_VERSION} from ${reference.source} (sha256 ${sha256.slice(0, 12)}...)`);
107
- say(`Extensions: ${extensionsSource} (${extensions.columns.length} columns, ${extensions.constraints.length} constraints)`);
108
- for (const [table, counts] of Object.entries(baseline.manifest.tables)) {
109
- say(` ${table}: ${counts.columns} base columns, ${counts.constraints} constraints, ${counts.extensions} extensions`);
110
- }
111
- if (options.kept) {
112
- say('Base columns kept per table (review that none belongs to a consumer):');
113
- for (const table of Object.keys(baseline.inventory.tables)) {
114
- say(` ${table}: ${keptColumns(baseline.inventory, table).join(', ')}`);
115
- }
116
- }
117
- if (options.print) {
118
- process.stdout.write(baseline.sql);
119
- return;
120
- }
121
- const out = options.out ?? 'packages/m/src/base-model/baseline.generated.ts';
122
- writeFileSync(out, renderGeneratedModule(baseline), 'utf-8');
123
- success(`[OK] wrote ${out}`);
124
- }
125
- async function runVerify() {
126
- const options = readOptions();
127
- const reference = readReference(options);
128
- const { extensions } = readExtensions(options);
129
- const parsed = parseStructureSql(reference.sql);
130
- const derived = buildInventory(parsed, { parsed, extensions, version: BASE_MODEL_VERSION });
131
- const diffs = diffInventories(BASELINE_INVENTORY, derived);
132
- const missingExtensions = extensions.columns.filter((entry) => {
133
- const [table, column] = entry.split('.');
134
- return !parsed.tables[table]?.columns.some((candidate) => candidate.name === column);
135
- });
136
- info(`Verifying shipped base model ${BASE_MODEL_VERSION} against ${reference.source}`);
137
- info(` base tables: ${Object.keys(BASELINE_INVENTORY.tables).length}, derived from reference: ${Object.keys(derived.tables).length}`);
138
- info(` declared extensions: ${extensions.columns.length} columns, ${extensions.constraints.length} constraints`);
139
- for (const entry of missingExtensions) {
140
- problem(`[FAIL] declared extension is not in the reference: ${entry}`);
141
- }
142
- for (const diff of diffs) {
143
- if (diff.onlyInBase.length > 0)
144
- warn(`[WARN] ${diff.table}: only in the shipped baseline: ${diff.onlyInBase.join(', ')}`);
145
- if (diff.onlyInOther.length > 0)
146
- warn(`[WARN] ${diff.table}: only in the reference (undedared or stale): ${diff.onlyInOther.join(', ')}`);
147
- }
148
- if (diffs.length > 0 || missingExtensions.length > 0) {
149
- process.exitCode = 1;
150
- problem('[FAIL] the shipped baseline is not consistent with the reference and the declared extensions');
151
- return;
152
- }
153
- success('[OK] shipped baseline matches the reference minus the declared extensions');
154
- info('Base columns classified as base (review them when the reference changes):');
155
- for (const table of Object.keys(BASELINE_INVENTORY.tables)) {
156
- info(` ${table}: ${keptColumns(BASELINE_INVENTORY, table).join(', ')}`);
157
- }
158
- }
159
- export async function runBaseModelDump() {
160
- try {
161
- await runDump();
162
- }
163
- catch (error) {
164
- problem(error instanceof Error ? error.message : String(error));
165
- process.exitCode = 1;
166
- }
167
- }
168
- export async function runBaseModelVerify() {
169
- try {
170
- await runVerify();
171
- }
172
- catch (error) {
173
- problem(error instanceof Error ? error.message : String(error));
174
- process.exitCode = 1;
175
- }
176
- }
177
- //# sourceMappingURL=base-model.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-model.js","sourceRoot":"","sources":["../../src/tasks/base-model.ts"],"names":[],"mappings":"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"}
@@ -1,47 +0,0 @@
1
- // SPDX-License-Identifier: MIT
2
- pragma solidity ^0.8.24;
3
-
4
- contract MockUSDT {
5
- string public constant name = "Mock USDT";
6
- string public constant symbol = "MUSDT";
7
- uint8 public constant decimals = 6;
8
- uint256 public totalSupply;
9
-
10
- mapping(address => uint256) public balanceOf;
11
- mapping(address => mapping(address => uint256)) public allowance;
12
-
13
- event Transfer(address indexed from, address indexed to, uint256 value);
14
- event Approval(address indexed owner, address indexed spender, uint256 value);
15
-
16
- function mint(address to, uint256 amount) external {
17
- totalSupply += amount;
18
- balanceOf[to] += amount;
19
- emit Transfer(address(0), to, amount);
20
- }
21
-
22
- function transfer(address to, uint256 amount) external returns (bool) {
23
- require(balanceOf[msg.sender] >= amount, "Insufficient balance");
24
- balanceOf[msg.sender] -= amount;
25
- balanceOf[to] += amount;
26
- emit Transfer(msg.sender, to, amount);
27
- return true;
28
- }
29
-
30
- function transferFrom(address from, address to, uint256 amount) external returns (bool) {
31
- require(balanceOf[from] >= amount, "Insufficient balance");
32
- require(allowance[from][msg.sender] >= amount, "Insufficient allowance");
33
-
34
- balanceOf[from] -= amount;
35
- balanceOf[to] += amount;
36
- allowance[from][msg.sender] -= amount;
37
-
38
- emit Transfer(from, to, amount);
39
- return true;
40
- }
41
-
42
- function approve(address spender, uint256 amount) external returns (bool) {
43
- allowance[msg.sender][spender] = amount;
44
- emit Approval(msg.sender, spender, amount);
45
- return true;
46
- }
47
- }
@@ -1,40 +0,0 @@
1
- import { expect } from "chai";
2
- import { ethers } from "hardhat";
3
-
4
- describe.skip("MockUSDT", function () {
5
- it("Should deploy with correct name and symbol", async function () {
6
- const MockUSDT = await ethers.getContractFactory("MockUSDT");
7
- const mockUSDT = await MockUSDT.deploy();
8
- await mockUSDT.waitForDeployment();
9
-
10
- expect(await mockUSDT.name()).to.equal("Mock USDT");
11
- expect(await mockUSDT.symbol()).to.equal("MUSDT");
12
- expect(await mockUSDT.decimals()).to.equal(6);
13
- });
14
-
15
- it("Should have initial supply of 0 tokens", async function () {
16
- const MockUSDT = await ethers.getContractFactory("MockUSDT");
17
- const mockUSDT = await MockUSDT.deploy();
18
- await mockUSDT.waitForDeployment();
19
-
20
- const totalSupply = await mockUSDT.totalSupply();
21
- expect(totalSupply).to.equal(0);
22
- });
23
-
24
- it("Should allow transfers", async function () {
25
- const [owner, recipient] = await ethers.getSigners();
26
- const MockUSDT = await ethers.getContractFactory("MockUSDT");
27
- const mockUSDT = await MockUSDT.deploy();
28
- await mockUSDT.waitForDeployment();
29
-
30
- // Mint tokens to owner first
31
- const mintAmount = ethers.parseUnits("1000", 6);
32
- await mockUSDT.mint(owner.address, mintAmount);
33
-
34
- const transferAmount = ethers.parseUnits("100", 6);
35
- await mockUSDT.transfer(recipient.address, transferAmount);
36
-
37
- const recipientBalance = await mockUSDT.balanceOf(recipient.address);
38
- expect(recipientBalance).to.equal(transferAmount);
39
- });
40
- });