@algorandfoundation/puya-ts 1.2.0-beta.2 → 1.2.0-beta.21
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.
- package/README.md +7 -5
- package/{analyser-service-DSK9g7zQ.js → analyser-service-CGprVWba.js} +409 -372
- package/analyser-service-CGprVWba.js.map +1 -0
- package/analyserService.mjs +7 -6
- package/analyserService.mjs.map +1 -1
- package/arc4-clientgen-C7FQSt3R.js +324 -0
- package/arc4-clientgen-C7FQSt3R.js.map +1 -0
- package/arc4-clientgen.d.ts +6 -0
- package/awst/intrinsic-factory.d.ts +4 -2
- package/awst/node-factory.d.ts +1 -0
- package/awst/nodes.d.ts +22 -2
- package/awst/to-code-visitor.d.ts +2 -0
- package/awst/validation/awst-traverser.d.ts +3 -1
- package/awst/wtypes.d.ts +8 -1
- package/awst_build/arc4-util.d.ts +1 -38
- package/awst_build/ast-visitors/contract-method-visitor.d.ts +0 -2
- package/awst_build/eb/arc28/arc-28-emit-function-builder.d.ts +1 -2
- package/awst_build/eb/arc4/uintn.d.ts +1 -1
- package/awst_build/eb/arc4/util.d.ts +1 -0
- package/awst_build/eb/array-like/util.d.ts +0 -1
- package/awst_build/eb/logged-error-builder.d.ts +11 -0
- package/awst_build/models/decorator-data.d.ts +1 -0
- package/awst_build/ptypes/for-export.d.ts +0 -1
- package/awst_build/ptypes/index.d.ts +2 -0
- package/bin/puyats-clientgen.d.ts +2 -0
- package/bin/puyats-clientgen.mjs +101 -0
- package/bin/puyats-clientgen.mjs.map +1 -0
- package/bin/puyats-ls.mjs +21 -46
- package/bin/puyats-ls.mjs.map +1 -1
- package/bin/run-cli.mjs +18 -12
- package/bin/run-cli.mjs.map +1 -1
- package/{check-node-version-BtcNqlid.js → check-node-version-DcMVGPC-.js} +3 -3
- package/{check-node-version-BtcNqlid.js.map → check-node-version-DcMVGPC-.js.map} +1 -1
- package/cli/build-command.d.ts +2 -0
- package/cli.mjs +36 -76
- package/cli.mjs.map +1 -1
- package/clientgen.d.ts +1 -0
- package/code-fix/{invalid-non-null-assertion.d.ts → no-op-non-null-assertion.d.ts} +1 -1
- package/{compile-Cj7vjDbw.js → compile-D0CpLiRh.js} +13 -4
- package/compile-D0CpLiRh.js.map +1 -0
- package/compile.d.ts +1 -1
- package/constants.d.ts +1 -1
- package/contract-class-model-CLKobHyV.js +5574 -0
- package/contract-class-model-CLKobHyV.js.map +1 -0
- package/index.d.ts +1 -1
- package/index.mjs +17 -10
- package/index.mjs.map +1 -1
- package/logger/index.d.ts +1 -0
- package/{options-Cbipn6vL.js → options-B93nVWrL.js} +2419 -8288
- package/options-B93nVWrL.js.map +1 -0
- package/options.d.ts +4 -0
- package/package.json +13 -12
- package/puya/puya-service.d.ts +5 -1
- package/{resolve-puya-path-CsuzbFH2.js → resolve-puya-path-D7qDcdPx.js} +9 -45
- package/resolve-puya-path-D7qDcdPx.js.map +1 -0
- package/semver-BPw8lYGI.js +45 -0
- package/semver-BPw8lYGI.js.map +1 -0
- package/util/typed-message-port.d.ts +2 -2
- package/util-BhM5b2cL.js +63 -0
- package/util-BhM5b2cL.js.map +1 -0
- package/visitor/syntax-names.d.ts +190 -190
- package/analyser-service-DSK9g7zQ.js.map +0 -1
- package/compile-Cj7vjDbw.js.map +0 -1
- package/options-Cbipn6vL.js.map +0 -1
- package/puya/index.d.ts +0 -14
- package/resolve-puya-path-CsuzbFH2.js.map +0 -1
- package/util/arc4-signature-parser.d.ts +0 -14
package/analyserService.mjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import 'crypto';
|
|
2
2
|
import 'node:worker_threads';
|
|
3
|
-
export { c as createAnalyserService } from './analyser-service-
|
|
4
|
-
import './
|
|
3
|
+
export { c as createAnalyserService } from './analyser-service-CGprVWba.js';
|
|
4
|
+
import './contract-class-model-CLKobHyV.js';
|
|
5
|
+
import './options-B93nVWrL.js';
|
|
5
6
|
import 'pathe';
|
|
6
7
|
import 'typescript';
|
|
7
8
|
import 'node:util';
|
|
@@ -13,14 +14,14 @@ import 'url';
|
|
|
13
14
|
import 'fs';
|
|
14
15
|
import 'child_process';
|
|
15
16
|
import 'glob';
|
|
16
|
-
import 'arcsecond';
|
|
17
17
|
import 'node:fs';
|
|
18
|
-
import 'tslib';
|
|
19
|
-
import 'node:buffer';
|
|
20
18
|
import 'node:crypto';
|
|
19
|
+
import 'polytype';
|
|
21
20
|
import 'node:async_hooks';
|
|
21
|
+
import 'arcsecond';
|
|
22
|
+
import 'tslib';
|
|
23
|
+
import 'node:buffer';
|
|
22
24
|
import 'cross-spawn';
|
|
23
25
|
import 'change-case';
|
|
24
|
-
import 'polytype';
|
|
25
26
|
import 'minimatch';
|
|
26
27
|
//# sourceMappingURL=analyserService.mjs.map
|
package/analyserService.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyserService.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analyserService.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import * as abi from '@algorandfoundation/algokit-utils/abi';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { writeFile, readFile } from 'fs/promises';
|
|
4
|
+
import { C as ContractReference, b as ContractClassModel, A as AbsolutePath, l as logger, c as CodeError, d as Constants, I as InternalError, e as accountPType, f as applicationPType, g as assetPType, v as voidPType, h as anyGtxnType, p as paymentGtxnType, k as keyRegistrationGtxnType, i as assetConfigGtxnType, j as assetTransferGtxnType, m as assetFreezeGtxnType, n as applicationCallGtxnType, O as OnCompletionAction } from './contract-class-model-CLKobHyV.js';
|
|
5
|
+
|
|
6
|
+
const AUTO_GENERATED_COMMENT = '// This file is auto-generated, do not modify';
|
|
7
|
+
const DISABLE_ESLINT_PRAGMA = '/* eslint-disable */';
|
|
8
|
+
const ARC4_PYTYPE_MAPPING = new Map([
|
|
9
|
+
['account', accountPType],
|
|
10
|
+
['application', applicationPType],
|
|
11
|
+
['asset', assetPType],
|
|
12
|
+
['void', voidPType],
|
|
13
|
+
['txn', anyGtxnType],
|
|
14
|
+
['pay', paymentGtxnType],
|
|
15
|
+
['keyreg', keyRegistrationGtxnType],
|
|
16
|
+
['acfg', assetConfigGtxnType],
|
|
17
|
+
['axfer', assetTransferGtxnType],
|
|
18
|
+
['afrz', assetFreezeGtxnType],
|
|
19
|
+
['appl', applicationCallGtxnType],
|
|
20
|
+
]);
|
|
21
|
+
function resolveClients(compilationSet, filePaths, arc56Contracts) {
|
|
22
|
+
const sourceFileToOutDir = new Map();
|
|
23
|
+
for (const { sourceFile, outDir } of filePaths) {
|
|
24
|
+
sourceFileToOutDir.set(sourceFile.toString(), outDir);
|
|
25
|
+
}
|
|
26
|
+
const arc56Files = [];
|
|
27
|
+
for (const ref of compilationSet.compilationOutputSet) {
|
|
28
|
+
if (!(ref instanceof ContractReference)) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const model = compilationSet.get(ref);
|
|
32
|
+
if (!(model instanceof ContractClassModel)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (!model.type.isARC4) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const sourceFile = AbsolutePath.resolve({ path: ref.moduleName });
|
|
39
|
+
const outDir = sourceFileToOutDir.get(sourceFile.toString());
|
|
40
|
+
if (outDir === undefined) {
|
|
41
|
+
logger.error(undefined, `Could not find a source file for the contract ${ref.className} at ${ref.moduleName}`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const spec = arc56Contracts[ref.id];
|
|
45
|
+
if (spec === undefined) {
|
|
46
|
+
logger.error(undefined, `Could not find a generated spec for the contract ${ref.className} at ${ref.moduleName}`);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const name = model.options?.name || model.name;
|
|
50
|
+
arc56Files.push({
|
|
51
|
+
spec,
|
|
52
|
+
outFile: outDir.join(`${name}.client.ts`),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return arc56Files;
|
|
56
|
+
}
|
|
57
|
+
function writeARC4Clients(compilationSet, filePaths, arc56Contracts) {
|
|
58
|
+
const clientFiles = resolveClients(compilationSet, filePaths, arc56Contracts);
|
|
59
|
+
return Promise.all(clientFiles.map(async (clientTask) => {
|
|
60
|
+
await writeARC4Client(clientTask.spec, clientTask.outFile);
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
async function writeARC4Client(spec, outFile) {
|
|
64
|
+
if (await shouldWriteFile(outFile)) {
|
|
65
|
+
logger.info(undefined, `Writing ${outFile.relativeTo('.')}`);
|
|
66
|
+
const typescriptClient = generateClientFor(spec);
|
|
67
|
+
await writeFile(outFile.toString(), typescriptClient, { encoding: 'utf-8' });
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
logger.error(undefined, `Not outputting ${outFile.relativeTo('.')} since content does not appear to be auto-generated`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async function shouldWriteFile(outFile) {
|
|
74
|
+
const filePath = outFile.toString();
|
|
75
|
+
// FIXME: There's a TOCTOU bug here...
|
|
76
|
+
if (!existsSync(filePath)) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
const contents = await readFile(filePath, { encoding: 'utf-8' });
|
|
80
|
+
return contents.startsWith(AUTO_GENERATED_COMMENT);
|
|
81
|
+
}
|
|
82
|
+
function generateClientFor(contract) {
|
|
83
|
+
const typeImports = new Set();
|
|
84
|
+
const imports = new Set();
|
|
85
|
+
const structToClass = new Map();
|
|
86
|
+
const reservedClassNames = new Set();
|
|
87
|
+
const reservedMethodNames = new Set();
|
|
88
|
+
const classDecls = [];
|
|
89
|
+
function useImport(name, asValue) {
|
|
90
|
+
if (asValue) {
|
|
91
|
+
if (typeImports.has(name))
|
|
92
|
+
typeImports.delete(name);
|
|
93
|
+
imports.add(name);
|
|
94
|
+
}
|
|
95
|
+
else if (!imports.has(name)) {
|
|
96
|
+
typeImports.add(name);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function indent(...texts) {
|
|
100
|
+
const INDENT = ' ';
|
|
101
|
+
return INDENT + texts.join('\n').replaceAll(/\n+/g, `$&${INDENT}`);
|
|
102
|
+
}
|
|
103
|
+
function classNameFor(name) {
|
|
104
|
+
const base_name = name;
|
|
105
|
+
let seq = 1;
|
|
106
|
+
while (reservedClassNames.has(name)) {
|
|
107
|
+
seq++;
|
|
108
|
+
name = `${base_name}${seq}`;
|
|
109
|
+
}
|
|
110
|
+
reservedClassNames.add(name);
|
|
111
|
+
return name;
|
|
112
|
+
}
|
|
113
|
+
function methodNameFor(name) {
|
|
114
|
+
const base_name = name;
|
|
115
|
+
let seq = 1;
|
|
116
|
+
while (reservedMethodNames.has(name)) {
|
|
117
|
+
seq++;
|
|
118
|
+
name = `${base_name}${seq}`;
|
|
119
|
+
}
|
|
120
|
+
reservedMethodNames.add(name);
|
|
121
|
+
return name;
|
|
122
|
+
}
|
|
123
|
+
function typeNameToAlgoTSName(typeName) {
|
|
124
|
+
const knownMapping = ARC4_PYTYPE_MAPPING.get(typeName);
|
|
125
|
+
if (knownMapping !== undefined) {
|
|
126
|
+
const { name, module } = knownMapping;
|
|
127
|
+
if (module === Constants.moduleNames.algoTs.gtxn) {
|
|
128
|
+
useImport('gtxn', false);
|
|
129
|
+
return `gtxn.${name}`;
|
|
130
|
+
}
|
|
131
|
+
else if (module === Constants.moduleNames.algoTs.reference) {
|
|
132
|
+
useImport(name, false);
|
|
133
|
+
return name;
|
|
134
|
+
}
|
|
135
|
+
else if (module === 'lib.d.ts') {
|
|
136
|
+
// The TypeScript prelude is always imported
|
|
137
|
+
return name;
|
|
138
|
+
}
|
|
139
|
+
throw new InternalError(`Cannot import ${name}: The module ${module} is unsupported`);
|
|
140
|
+
}
|
|
141
|
+
return ARC4ToAlgoTSName(abi.ABIType.from(typeName));
|
|
142
|
+
}
|
|
143
|
+
function ARC4ToAlgoTSName(type) {
|
|
144
|
+
useImport('arc4', false);
|
|
145
|
+
if (type instanceof abi.ABIBoolType)
|
|
146
|
+
return 'arc4.Bool';
|
|
147
|
+
if (type instanceof abi.ABIStringType)
|
|
148
|
+
return 'arc4.Str';
|
|
149
|
+
if (type instanceof abi.ABIAddressType)
|
|
150
|
+
return 'arc4.Address';
|
|
151
|
+
if (type instanceof abi.ABIByteType)
|
|
152
|
+
return 'arc4.Byte';
|
|
153
|
+
if (type instanceof abi.ABIUintType)
|
|
154
|
+
return `arc4.Uint<${type.bitSize}>`;
|
|
155
|
+
if (type instanceof abi.ABIUfixedType)
|
|
156
|
+
return `arc4.UFixed<${type.bitSize}, ${type.precision}>`;
|
|
157
|
+
if (type instanceof abi.ABIArrayStaticType) {
|
|
158
|
+
const elementType = ARC4ToAlgoTSName(type.childType);
|
|
159
|
+
return `arc4.StaticArray<${elementType}, ${type.length}>`;
|
|
160
|
+
}
|
|
161
|
+
if (type instanceof abi.ABIArrayDynamicType) {
|
|
162
|
+
if (type.childType instanceof abi.ABIByteType)
|
|
163
|
+
return 'arc4.DynamicBytes';
|
|
164
|
+
const elementType = ARC4ToAlgoTSName(type.childType);
|
|
165
|
+
return `arc4.DynamicArray<${elementType}>`;
|
|
166
|
+
}
|
|
167
|
+
if (type instanceof abi.ABITupleType) {
|
|
168
|
+
const tupleTypes = type.childTypes.map(ARC4ToAlgoTSName);
|
|
169
|
+
return `arc4.Tuple<readonly [${tupleTypes.join(', ')}]>`;
|
|
170
|
+
}
|
|
171
|
+
throw new CodeError(`unknown ARC-4 type '${type}'`);
|
|
172
|
+
}
|
|
173
|
+
function getClientType(type) {
|
|
174
|
+
// map ABI / AVM type to algots type
|
|
175
|
+
if (type === 'AVMUint64') {
|
|
176
|
+
useImport('uint64', false);
|
|
177
|
+
return 'uint64';
|
|
178
|
+
}
|
|
179
|
+
else if (type === 'AVMBytes') {
|
|
180
|
+
useImport('bytes', false);
|
|
181
|
+
return 'bytes';
|
|
182
|
+
}
|
|
183
|
+
else if (type in contract.structs) {
|
|
184
|
+
return structToClass.get(type) || prepareStructClass(type, contract.structs[type]);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
return typeNameToAlgoTSName(type);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function prepareStructClass(name, fields) {
|
|
191
|
+
useImport('arc4', true);
|
|
192
|
+
const className = classNameFor(name);
|
|
193
|
+
structToClass.set(name, className);
|
|
194
|
+
const lines = ['', `export class ${className} extends arc4.Struct<{`];
|
|
195
|
+
for (const field of fields) {
|
|
196
|
+
let type;
|
|
197
|
+
if (typeof field.type === 'string') {
|
|
198
|
+
type = getClientType(field.type);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
// generate anonymous struct type
|
|
202
|
+
const anonStruct = `${name}_${field.name}`;
|
|
203
|
+
type = prepareStructClass(anonStruct, field.type);
|
|
204
|
+
}
|
|
205
|
+
lines.push(indent(`${field.name}: ${type}`));
|
|
206
|
+
}
|
|
207
|
+
lines.push('}> {}');
|
|
208
|
+
classDecls.push(...lines);
|
|
209
|
+
return className;
|
|
210
|
+
}
|
|
211
|
+
function tsdoc(description) {
|
|
212
|
+
if (description === undefined || description === null) {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
return ['/**', ` * ${description.replaceAll(/\n+/g, '$& * ')}`, ' */'];
|
|
216
|
+
}
|
|
217
|
+
function compatibleActions(create, call) {
|
|
218
|
+
if (create.length === 0) {
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
if (call.length === 0) {
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
// if both collections are present, then they are compatible if everything in
|
|
225
|
+
// create is also in call
|
|
226
|
+
const createSet = new Set(create);
|
|
227
|
+
const callSet = new Set(call);
|
|
228
|
+
return createSet.symmetricDifference(callSet).size === 0;
|
|
229
|
+
}
|
|
230
|
+
function ARC4MethodToTSDecorator(name, method) {
|
|
231
|
+
useImport('abimethod', true);
|
|
232
|
+
const abimethodArgs = [];
|
|
233
|
+
if (method.name !== name) {
|
|
234
|
+
abimethodArgs.push(`name: '${method.name}'`);
|
|
235
|
+
}
|
|
236
|
+
if (method.readonly) {
|
|
237
|
+
abimethodArgs.push('readonly: true');
|
|
238
|
+
}
|
|
239
|
+
// if any alias types are encountered, force index encoding
|
|
240
|
+
const argTypes = new Set(method.args.map((v) => v.type));
|
|
241
|
+
const aliasTypes = new Set(['asset', 'application', 'account']);
|
|
242
|
+
if (argTypes.intersection(aliasTypes).size !== 0) {
|
|
243
|
+
abimethodArgs.push("resourceEncoding: 'index'");
|
|
244
|
+
}
|
|
245
|
+
if (!compatibleActions(method.actions.create, method.actions.call)) {
|
|
246
|
+
// TODO: support this, once decorators support it
|
|
247
|
+
throw new CodeError(`unsupported on completion combination for generating an ARC-4 client for method: ${method.name}`);
|
|
248
|
+
}
|
|
249
|
+
const actions = [...method.actions.create, ...method.actions.call];
|
|
250
|
+
actions.sort((a, b) => OnCompletionAction[a] - OnCompletionAction[b]);
|
|
251
|
+
const uniqueActions = new Set(actions);
|
|
252
|
+
if (!(uniqueActions.size === 1 && uniqueActions.has('NoOp'))) {
|
|
253
|
+
abimethodArgs.push(`allowActions: [${actions.map((v) => `'${v}'`).join(', ')}]`);
|
|
254
|
+
}
|
|
255
|
+
if (method.actions.create.length !== 0 && method.actions.call.length !== 0) {
|
|
256
|
+
abimethodArgs.push("onCreate: 'allow'");
|
|
257
|
+
}
|
|
258
|
+
else if (method.actions.create.length !== 0) {
|
|
259
|
+
abimethodArgs.push("onCreate: 'require'");
|
|
260
|
+
}
|
|
261
|
+
else ;
|
|
262
|
+
const args = abimethodArgs.length === 0 ? '' : `{ ${abimethodArgs.join(', ')} }`;
|
|
263
|
+
return `@abimethod(${args})`;
|
|
264
|
+
}
|
|
265
|
+
function genArg(arg) {
|
|
266
|
+
const argType = getClientType(arg.struct || arg.type);
|
|
267
|
+
return `${arg.name}: ${argType},`;
|
|
268
|
+
}
|
|
269
|
+
function genMethod(method) {
|
|
270
|
+
useImport('err', true);
|
|
271
|
+
const return_type = getClientType(method.returns.struct || method.returns.type);
|
|
272
|
+
const method_name = methodNameFor(method.name);
|
|
273
|
+
const args = method.args.map(genArg);
|
|
274
|
+
let arglist;
|
|
275
|
+
if (args.length === 0) {
|
|
276
|
+
// No args -> inline arglist
|
|
277
|
+
arglist = '()';
|
|
278
|
+
}
|
|
279
|
+
else if (args.length === 1) {
|
|
280
|
+
// One arg -> inline arglist (remove trailing comma)
|
|
281
|
+
arglist = `(${args[0].slice(0, -1)})`;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
// At least two args -> multiline arglist
|
|
285
|
+
arglist = `(\n${indent(...args)}\n)`;
|
|
286
|
+
}
|
|
287
|
+
return indent(...tsdoc(method.desc), ARC4MethodToTSDecorator(method_name, method), `${method_name}${arglist}: ${return_type} {`, indent("err('stub only')"), '}');
|
|
288
|
+
}
|
|
289
|
+
function genMethods() {
|
|
290
|
+
const methods = [];
|
|
291
|
+
if (contract.methods.length !== 0) {
|
|
292
|
+
methods.push(genMethod(contract.methods[0]));
|
|
293
|
+
}
|
|
294
|
+
for (const method of contract.methods.slice(1)) {
|
|
295
|
+
methods.push(`\n${genMethod(method)}`);
|
|
296
|
+
}
|
|
297
|
+
return methods;
|
|
298
|
+
}
|
|
299
|
+
// generate class definitions for any referenced structs in methods
|
|
300
|
+
// don't generate from self.contract.structs as it may contain other struct definitions
|
|
301
|
+
const clientClass = classNameFor(contract.name);
|
|
302
|
+
const docs = tsdoc(contract.desc);
|
|
303
|
+
const methods = genMethods();
|
|
304
|
+
useImport('Contract', true);
|
|
305
|
+
const sortedTypeImports = [...typeImports].toSorted().join(', ');
|
|
306
|
+
const sortedImports = [...imports].toSorted().join(', ');
|
|
307
|
+
const lines = [];
|
|
308
|
+
// Header
|
|
309
|
+
lines.push(AUTO_GENERATED_COMMENT);
|
|
310
|
+
lines.push(DISABLE_ESLINT_PRAGMA);
|
|
311
|
+
if (sortedTypeImports.length !== 0)
|
|
312
|
+
lines.push(`import type { ${sortedTypeImports} } from '@algorandfoundation/algorand-typescript'`);
|
|
313
|
+
if (sortedImports.length !== 0)
|
|
314
|
+
lines.push(`import { ${sortedImports} } from '@algorandfoundation/algorand-typescript'`);
|
|
315
|
+
lines.push(
|
|
316
|
+
// Struct declarations
|
|
317
|
+
...classDecls, '',
|
|
318
|
+
// Contract definition
|
|
319
|
+
...docs, `export abstract class ${clientClass} extends Contract {`, ...methods, '}', '');
|
|
320
|
+
return lines.join('\n');
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export { writeARC4Clients as a, writeARC4Client as w };
|
|
324
|
+
//# sourceMappingURL=arc4-clientgen-C7FQSt3R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arc4-clientgen-C7FQSt3R.js","sources":["../src/arc4-clientgen.ts"],"sourcesContent":["import * as abi from '@algorandfoundation/algokit-utils/abi'\nimport { existsSync } from 'fs'\nimport { readFile, writeFile } from 'fs/promises'\nimport { ContractReference, OnCompletionAction } from './awst/models'\nimport type { CompilationSet } from './awst_build/models/contract-class-model'\nimport { ContractClassModel } from './awst_build/models/contract-class-model'\nimport type { ABICompatiblePType } from './awst_build/ptypes'\nimport * as ptype from './awst_build/ptypes'\nimport { Constants } from './constants'\nimport { CodeError, InternalError } from './errors'\nimport { logger } from './logger'\nimport type { AlgoFile } from './options'\nimport { AbsolutePath } from './util/absolute-path'\n\ntype Arc56Arg = abi.Arc56Method['args'][number]\n\ntype ClientTask = {\n spec: abi.Arc56Contract\n outFile: AbsolutePath\n}\n\nconst AUTO_GENERATED_COMMENT = '// This file is auto-generated, do not modify'\nconst DISABLE_ESLINT_PRAGMA = '/* eslint-disable */'\n\nconst ARC4_PYTYPE_MAPPING = new Map<string, ABICompatiblePType>([\n ['account', ptype.accountPType],\n ['application', ptype.applicationPType],\n ['asset', ptype.assetPType],\n ['void', ptype.voidPType],\n ['txn', ptype.anyGtxnType],\n ['pay', ptype.paymentGtxnType],\n ['keyreg', ptype.keyRegistrationGtxnType],\n ['acfg', ptype.assetConfigGtxnType],\n ['axfer', ptype.assetTransferGtxnType],\n ['afrz', ptype.assetFreezeGtxnType],\n ['appl', ptype.applicationCallGtxnType],\n])\n\nfunction resolveClients(\n compilationSet: CompilationSet,\n filePaths: AlgoFile[],\n arc56Contracts: Record<string, abi.Arc56Contract>,\n): ClientTask[] {\n const sourceFileToOutDir = new Map<string, AbsolutePath>()\n for (const { sourceFile, outDir } of filePaths) {\n sourceFileToOutDir.set(sourceFile.toString(), outDir)\n }\n\n const arc56Files = []\n for (const ref of compilationSet.compilationOutputSet) {\n if (!(ref instanceof ContractReference)) {\n continue\n }\n const model = compilationSet.get(ref)\n if (!(model instanceof ContractClassModel)) {\n continue\n }\n if (!model.type.isARC4) {\n continue\n }\n\n const sourceFile = AbsolutePath.resolve({ path: ref.moduleName })\n const outDir = sourceFileToOutDir.get(sourceFile.toString())\n if (outDir === undefined) {\n logger.error(undefined, `Could not find a source file for the contract ${ref.className} at ${ref.moduleName}`)\n continue\n }\n\n const spec = arc56Contracts[ref.id]\n if (spec === undefined) {\n logger.error(undefined, `Could not find a generated spec for the contract ${ref.className} at ${ref.moduleName}`)\n continue\n }\n\n const name = model.options?.name || model.name\n arc56Files.push({\n spec,\n outFile: outDir.join(`${name}.client.ts`),\n })\n }\n return arc56Files\n}\n\nexport function writeARC4Clients(compilationSet: CompilationSet, filePaths: AlgoFile[], arc56Contracts: Record<string, abi.Arc56Contract>) {\n const clientFiles = resolveClients(compilationSet, filePaths, arc56Contracts)\n return Promise.all(\n clientFiles.map(async (clientTask) => {\n await writeARC4Client(clientTask.spec, clientTask.outFile)\n }),\n )\n}\n\nexport async function writeARC4Client(spec: abi.Arc56Contract, outFile: AbsolutePath) {\n if (await shouldWriteFile(outFile)) {\n logger.info(undefined, `Writing ${outFile.relativeTo('.')}`)\n const typescriptClient = generateClientFor(spec)\n await writeFile(outFile.toString(), typescriptClient, { encoding: 'utf-8' })\n } else {\n logger.error(undefined, `Not outputting ${outFile.relativeTo('.')} since content does not appear to be auto-generated`)\n }\n}\n\nasync function shouldWriteFile(outFile: AbsolutePath): Promise<boolean> {\n const filePath = outFile.toString()\n // FIXME: There's a TOCTOU bug here...\n if (!existsSync(filePath)) {\n return true\n }\n const contents = await readFile(filePath, { encoding: 'utf-8' })\n return contents.startsWith(AUTO_GENERATED_COMMENT)\n}\n\nfunction generateClientFor(contract: abi.Arc56Contract): string {\n const typeImports = new Set<string>()\n const imports = new Set<string>()\n const structToClass = new Map<string, string>()\n const reservedClassNames = new Set<string>()\n const reservedMethodNames = new Set<string>()\n const classDecls: string[] = []\n\n function useImport(name: string, asValue: boolean) {\n if (asValue) {\n if (typeImports.has(name)) typeImports.delete(name)\n imports.add(name)\n } else if (!imports.has(name)) {\n typeImports.add(name)\n }\n }\n function indent(...texts: string[]): string {\n const INDENT = ' '\n return INDENT + texts.join('\\n').replaceAll(/\\n+/g, `$&${INDENT}`)\n }\n\n function classNameFor(name: string): string {\n const base_name = name\n let seq = 1\n while (reservedClassNames.has(name)) {\n seq++\n name = `${base_name}${seq}`\n }\n\n reservedClassNames.add(name)\n return name\n }\n\n function methodNameFor(name: string): string {\n const base_name = name\n let seq = 1\n while (reservedMethodNames.has(name)) {\n seq++\n name = `${base_name}${seq}`\n }\n\n reservedMethodNames.add(name)\n return name\n }\n\n function typeNameToAlgoTSName(typeName: string): string {\n const knownMapping = ARC4_PYTYPE_MAPPING.get(typeName)\n if (knownMapping !== undefined) {\n const { name, module } = knownMapping\n if (module === Constants.moduleNames.algoTs.gtxn) {\n useImport('gtxn', false)\n return `gtxn.${name}`\n } else if (module === Constants.moduleNames.algoTs.reference) {\n useImport(name, false)\n return name\n } else if (module === 'lib.d.ts') {\n // The TypeScript prelude is always imported\n return name\n }\n\n throw new InternalError(`Cannot import ${name}: The module ${module} is unsupported`)\n }\n return ARC4ToAlgoTSName(abi.ABIType.from(typeName))\n }\n\n function ARC4ToAlgoTSName(type: abi.ABIType): string {\n useImport('arc4', false)\n if (type instanceof abi.ABIBoolType) return 'arc4.Bool'\n if (type instanceof abi.ABIStringType) return 'arc4.Str'\n if (type instanceof abi.ABIAddressType) return 'arc4.Address'\n if (type instanceof abi.ABIByteType) return 'arc4.Byte'\n if (type instanceof abi.ABIUintType) return `arc4.Uint<${type.bitSize}>`\n if (type instanceof abi.ABIUfixedType) return `arc4.UFixed<${type.bitSize}, ${type.precision}>`\n if (type instanceof abi.ABIArrayStaticType) {\n const elementType = ARC4ToAlgoTSName(type.childType)\n return `arc4.StaticArray<${elementType}, ${type.length}>`\n }\n if (type instanceof abi.ABIArrayDynamicType) {\n if (type.childType instanceof abi.ABIByteType) return 'arc4.DynamicBytes'\n\n const elementType = ARC4ToAlgoTSName(type.childType)\n return `arc4.DynamicArray<${elementType}>`\n }\n if (type instanceof abi.ABITupleType) {\n const tupleTypes = type.childTypes.map(ARC4ToAlgoTSName)\n return `arc4.Tuple<readonly [${tupleTypes.join(', ')}]>`\n }\n throw new CodeError(`unknown ARC-4 type '${type}'`)\n }\n\n function getClientType(type: string): string {\n // map ABI / AVM type to algots type\n if (type === 'AVMUint64') {\n useImport('uint64', false)\n return 'uint64'\n } else if (type === 'AVMBytes') {\n useImport('bytes', false)\n return 'bytes'\n } else if (type in contract.structs) {\n return structToClass.get(type) || prepareStructClass(type, contract.structs[type])\n } else {\n return typeNameToAlgoTSName(type)\n }\n }\n\n function prepareStructClass(name: string, fields: abi.StructField[]) {\n useImport('arc4', true)\n\n const className = classNameFor(name)\n structToClass.set(name, className)\n const lines = ['', `export class ${className} extends arc4.Struct<{`]\n for (const field of fields) {\n let type: string\n if (typeof field.type === 'string') {\n type = getClientType(field.type)\n } else {\n // generate anonymous struct type\n const anonStruct = `${name}_${field.name}`\n type = prepareStructClass(anonStruct, field.type)\n }\n lines.push(indent(`${field.name}: ${type}`))\n }\n lines.push('}> {}')\n classDecls.push(...lines)\n return className\n }\n\n function tsdoc(description: string | undefined | null): string[] {\n if (description === undefined || description === null) {\n return []\n }\n return ['/**', ` * ${description.replaceAll(/\\n+/g, '$& * ')}`, ' */']\n }\n\n function compatibleActions(create: string[], call: string[]): boolean {\n if (create.length === 0) {\n return true\n }\n if (call.length === 0) {\n return true\n }\n // if both collections are present, then they are compatible if everything in\n // create is also in call\n const createSet = new Set(create)\n const callSet = new Set(call)\n return createSet.symmetricDifference(callSet).size === 0\n }\n\n function ARC4MethodToTSDecorator(name: string, method: abi.Arc56Method): string {\n useImport('abimethod', true)\n\n const abimethodArgs: string[] = []\n if (method.name !== name) {\n abimethodArgs.push(`name: '${method.name}'`)\n }\n if (method.readonly) {\n abimethodArgs.push('readonly: true')\n }\n // if any alias types are encountered, force index encoding\n const argTypes = new Set(method.args.map((v) => v.type))\n const aliasTypes = new Set(['asset', 'application', 'account'])\n if (argTypes.intersection(aliasTypes).size !== 0) {\n abimethodArgs.push(\"resourceEncoding: 'index'\")\n }\n if (!compatibleActions(method.actions.create, method.actions.call)) {\n // TODO: support this, once decorators support it\n throw new CodeError(`unsupported on completion combination for generating an ARC-4 client for method: ${method.name}`)\n }\n const actions = [...method.actions.create, ...method.actions.call]\n actions.sort((a, b) => OnCompletionAction[a] - OnCompletionAction[b])\n const uniqueActions = new Set(actions)\n\n if (!(uniqueActions.size === 1 && uniqueActions.has('NoOp'))) {\n abimethodArgs.push(`allowActions: [${actions.map((v) => `'${v}'`).join(', ')}]`)\n }\n if (method.actions.create.length !== 0 && method.actions.call.length !== 0) {\n abimethodArgs.push(\"onCreate: 'allow'\")\n } else if (method.actions.create.length !== 0) {\n abimethodArgs.push(\"onCreate: 'require'\")\n } else {\n // disallow is default\n }\n const args = abimethodArgs.length === 0 ? '' : `{ ${abimethodArgs.join(', ')} }`\n return `@abimethod(${args})`\n }\n\n function genArg(arg: Arc56Arg): string {\n const argType = getClientType(arg.struct || arg.type)\n return `${arg.name}: ${argType},`\n }\n\n function genMethod(method: abi.Arc56Method): string {\n useImport('err', true)\n\n const return_type = getClientType(method.returns.struct || method.returns.type)\n const method_name = methodNameFor(method.name)\n const args = method.args.map(genArg)\n let arglist: string\n if (args.length === 0) {\n // No args -> inline arglist\n arglist = '()'\n } else if (args.length === 1) {\n // One arg -> inline arglist (remove trailing comma)\n arglist = `(${args[0].slice(0, -1)})`\n } else {\n // At least two args -> multiline arglist\n arglist = `(\\n${indent(...args)}\\n)`\n }\n\n return indent(\n ...tsdoc(method.desc),\n ARC4MethodToTSDecorator(method_name, method),\n `${method_name}${arglist}: ${return_type} {`,\n indent(\"err('stub only')\"),\n '}',\n )\n }\n\n function genMethods(): string[] {\n const methods = []\n if (contract.methods.length !== 0) {\n methods.push(genMethod(contract.methods[0]))\n }\n for (const method of contract.methods.slice(1)) {\n methods.push(`\\n${genMethod(method)}`)\n }\n return methods\n }\n\n // generate class definitions for any referenced structs in methods\n // don't generate from self.contract.structs as it may contain other struct definitions\n const clientClass = classNameFor(contract.name)\n const docs = tsdoc(contract.desc)\n const methods = genMethods()\n useImport('Contract', true)\n\n const sortedTypeImports = [...typeImports].toSorted().join(', ')\n const sortedImports = [...imports].toSorted().join(', ')\n const lines = []\n // Header\n lines.push(AUTO_GENERATED_COMMENT)\n lines.push(DISABLE_ESLINT_PRAGMA)\n if (sortedTypeImports.length !== 0) lines.push(`import type { ${sortedTypeImports} } from '@algorandfoundation/algorand-typescript'`)\n if (sortedImports.length !== 0) lines.push(`import { ${sortedImports} } from '@algorandfoundation/algorand-typescript'`)\n\n lines.push(\n // Struct declarations\n ...classDecls,\n '',\n // Contract definition\n ...docs,\n `export abstract class ${clientClass} extends Contract {`,\n ...methods,\n '}',\n '',\n )\n return lines.join('\\n')\n}\n"],"names":["ptype.accountPType","ptype.applicationPType","ptype.assetPType","ptype.voidPType","ptype.anyGtxnType","ptype.paymentGtxnType","ptype.keyRegistrationGtxnType","ptype.assetConfigGtxnType","ptype.assetTransferGtxnType","ptype.assetFreezeGtxnType","ptype.applicationCallGtxnType"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as abi from '@algorandfoundation/algokit-utils/abi';
|
|
2
|
+
import type { CompilationSet } from './awst_build/models/contract-class-model';
|
|
3
|
+
import type { AlgoFile } from './options';
|
|
4
|
+
import { AbsolutePath } from './util/absolute-path';
|
|
5
|
+
export declare function writeARC4Clients(compilationSet: CompilationSet, filePaths: AlgoFile[], arc56Contracts: Record<string, abi.Arc56Contract>): Promise<void[]>;
|
|
6
|
+
export declare function writeARC4Client(spec: abi.Arc56Contract, outFile: AbsolutePath): Promise<void>;
|
|
@@ -8,14 +8,16 @@ export declare const intrinsicFactory: {
|
|
|
8
8
|
right: awst.Expression;
|
|
9
9
|
sourceLocation: SourceLocation;
|
|
10
10
|
}): awst.BytesConstant | awst.StringConstant | awst.IntrinsicCall;
|
|
11
|
-
err({ sourceLocation, comment }: {
|
|
11
|
+
err({ sourceLocation, comment, logError }: {
|
|
12
12
|
sourceLocation: SourceLocation;
|
|
13
13
|
comment: string | null;
|
|
14
|
+
logError?: boolean;
|
|
14
15
|
}): awst.AssertExpression;
|
|
15
|
-
assert({ sourceLocation, comment, condition }: {
|
|
16
|
+
assert({ sourceLocation, comment, condition, logError, }: {
|
|
16
17
|
sourceLocation: SourceLocation;
|
|
17
18
|
comment: string | null;
|
|
18
19
|
condition: Expression;
|
|
20
|
+
logError?: boolean;
|
|
19
21
|
}): awst.AssertExpression;
|
|
20
22
|
bytesLen({ value, sourceLocation }: {
|
|
21
23
|
value: awst.Expression;
|
package/awst/node-factory.d.ts
CHANGED
package/awst/nodes.d.ts
CHANGED
|
@@ -73,6 +73,7 @@ export declare class AssertExpression extends Expression {
|
|
|
73
73
|
readonly errorMessage: string | null;
|
|
74
74
|
readonly wtype: wtypes.WType;
|
|
75
75
|
readonly explicit: boolean;
|
|
76
|
+
readonly logError: boolean;
|
|
76
77
|
accept<T>(visitor: ExpressionVisitor<T>): T;
|
|
77
78
|
}
|
|
78
79
|
export declare class IntegerConstant extends Expression {
|
|
@@ -151,7 +152,7 @@ export declare class AddressConstant extends Expression {
|
|
|
151
152
|
export declare class ARC4Encode extends Expression {
|
|
152
153
|
constructor(props: Props<ARC4Encode>);
|
|
153
154
|
readonly value: Expression;
|
|
154
|
-
readonly wtype: wtypes.ARC4Type;
|
|
155
|
+
readonly wtype: wtypes.ARC4Type | wtypes.BytesWType;
|
|
155
156
|
readonly errorMessage: string | null;
|
|
156
157
|
accept<T>(visitor: ExpressionVisitor<T>): T;
|
|
157
158
|
}
|
|
@@ -468,6 +469,14 @@ export declare class SubroutineCallExpression extends Expression {
|
|
|
468
469
|
readonly args: Array<CallArg>;
|
|
469
470
|
accept<T>(visitor: ExpressionVisitor<T>): T;
|
|
470
471
|
}
|
|
472
|
+
export declare class ABICall extends Expression {
|
|
473
|
+
constructor(props: Props<ABICall>);
|
|
474
|
+
readonly target: MethodSignature | MethodSignatureString | null;
|
|
475
|
+
readonly args: Array<Expression>;
|
|
476
|
+
readonly fields: Map<TxnField, Expression>;
|
|
477
|
+
readonly wtype: wtypes.WABICallInnerTransactionFields;
|
|
478
|
+
accept<T>(visitor: ExpressionVisitor<T>): T;
|
|
479
|
+
}
|
|
471
480
|
export declare class PuyaLibData {
|
|
472
481
|
constructor(props: Props<PuyaLibData>);
|
|
473
482
|
readonly id: string;
|
|
@@ -619,9 +628,15 @@ export declare class BytesAugmentedAssignment extends Statement {
|
|
|
619
628
|
readonly value: Expression;
|
|
620
629
|
accept<T>(visitor: StatementVisitor<T>): T;
|
|
621
630
|
}
|
|
631
|
+
export declare class EmitFields extends Expression {
|
|
632
|
+
constructor(props: Props<EmitFields>);
|
|
633
|
+
readonly signature: string;
|
|
634
|
+
readonly values: Array<Expression>;
|
|
635
|
+
readonly wtype: wtypes.WType;
|
|
636
|
+
accept<T>(visitor: ExpressionVisitor<T>): T;
|
|
637
|
+
}
|
|
622
638
|
export declare class Emit extends Expression {
|
|
623
639
|
constructor(props: Props<Emit>);
|
|
624
|
-
readonly signature: string;
|
|
625
640
|
readonly value: Expression;
|
|
626
641
|
readonly wtype: wtypes.WType;
|
|
627
642
|
accept<T>(visitor: ExpressionVisitor<T>): T;
|
|
@@ -746,6 +761,7 @@ export declare class LogicSignature extends RootNode {
|
|
|
746
761
|
readonly docstring: string | null;
|
|
747
762
|
readonly reservedScratchSpace: Set<bigint>;
|
|
748
763
|
readonly avmVersion: bigint | null;
|
|
764
|
+
readonly validateEncoding: boolean | null;
|
|
749
765
|
accept<T>(visitor: RootNodeVisitor<T>): T;
|
|
750
766
|
}
|
|
751
767
|
export declare class CompiledContract extends Expression {
|
|
@@ -893,6 +909,7 @@ export declare const concreteNodes: {
|
|
|
893
909
|
readonly contractMethodTarget: typeof ContractMethodTarget;
|
|
894
910
|
readonly callArg: typeof CallArg;
|
|
895
911
|
readonly subroutineCallExpression: typeof SubroutineCallExpression;
|
|
912
|
+
readonly aBICall: typeof ABICall;
|
|
896
913
|
readonly puyaLibData: typeof PuyaLibData;
|
|
897
914
|
readonly puyaLibCall: typeof PuyaLibCall;
|
|
898
915
|
readonly uInt64UnaryOperation: typeof UInt64UnaryOperation;
|
|
@@ -907,6 +924,7 @@ export declare const concreteNodes: {
|
|
|
907
924
|
readonly uInt64AugmentedAssignment: typeof UInt64AugmentedAssignment;
|
|
908
925
|
readonly bigUIntAugmentedAssignment: typeof BigUIntAugmentedAssignment;
|
|
909
926
|
readonly bytesAugmentedAssignment: typeof BytesAugmentedAssignment;
|
|
927
|
+
readonly emitFields: typeof EmitFields;
|
|
910
928
|
readonly emit: typeof Emit;
|
|
911
929
|
readonly range: typeof Range;
|
|
912
930
|
readonly enumeration: typeof Enumeration;
|
|
@@ -1003,6 +1021,7 @@ export interface ExpressionVisitor<T> {
|
|
|
1003
1021
|
visitNumericComparisonExpression(expression: NumericComparisonExpression): T;
|
|
1004
1022
|
visitBytesComparisonExpression(expression: BytesComparisonExpression): T;
|
|
1005
1023
|
visitSubroutineCallExpression(expression: SubroutineCallExpression): T;
|
|
1024
|
+
visitABICall(expression: ABICall): T;
|
|
1006
1025
|
visitPuyaLibCall(expression: PuyaLibCall): T;
|
|
1007
1026
|
visitUInt64UnaryOperation(expression: UInt64UnaryOperation): T;
|
|
1008
1027
|
visitUInt64PostfixUnaryOperation(expression: UInt64PostfixUnaryOperation): T;
|
|
@@ -1013,6 +1032,7 @@ export interface ExpressionVisitor<T> {
|
|
|
1013
1032
|
visitBytesBinaryOperation(expression: BytesBinaryOperation): T;
|
|
1014
1033
|
visitBooleanBinaryOperation(expression: BooleanBinaryOperation): T;
|
|
1015
1034
|
visitNot(expression: Not): T;
|
|
1035
|
+
visitEmitFields(expression: EmitFields): T;
|
|
1016
1036
|
visitEmit(expression: Emit): T;
|
|
1017
1037
|
visitRange(expression: Range): T;
|
|
1018
1038
|
visitEnumeration(expression: Enumeration): T;
|
|
@@ -45,6 +45,7 @@ export declare class ToCodeVisitor implements nodes.RootNodeVisitor<string[]>, n
|
|
|
45
45
|
visitTupleItemExpression(expression: nodes.TupleItemExpression): string;
|
|
46
46
|
visitVarExpression(expression: nodes.VarExpression): string;
|
|
47
47
|
visitInnerTransactionField(expression: nodes.InnerTransactionField): string;
|
|
48
|
+
visitABICall(expression: nodes.ABICall): string;
|
|
48
49
|
visitSetInnerTransactionFields(expression: nodes.SetInnerTransactionFields): string;
|
|
49
50
|
visitSizeOf(expression: nodes.SizeOf): string;
|
|
50
51
|
visitSubmitInnerTransaction(expression: nodes.SubmitInnerTransaction): string;
|
|
@@ -89,6 +90,7 @@ export declare class ToCodeVisitor implements nodes.RootNodeVisitor<string[]>, n
|
|
|
89
90
|
visitForInLoop(statement: nodes.ForInLoop): string[];
|
|
90
91
|
visitSubroutine(moduleStatement: nodes.Subroutine): string[];
|
|
91
92
|
visitEmit(expression: nodes.Emit): string;
|
|
93
|
+
visitEmitFields(expression: nodes.EmitFields): string;
|
|
92
94
|
visitContractMethod(statement: nodes.ContractMethod): string[];
|
|
93
95
|
visitLogicSignature(moduleStatement: nodes.LogicSignature): string[];
|
|
94
96
|
visitAssertExpression(expression: nodes.AssertExpression): string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AddressConstant, AppAccountStateExpression, AppStateExpression, AppStorageDefinition, ARC4Decode, ARC4Encode, ARC4FromBytes, ARC4Router, ArrayConcat, ArrayExtend, ArrayLength, ArrayPop, ArrayReplace, AssertExpression, AssignmentExpression, AssignmentStatement, BigUIntAugmentedAssignment, BigUIntBinaryOperation, BigUIntPostfixUnaryOperation, Block, BoolConstant, BooleanBinaryOperation, BoxPrefixedKeyExpression, BoxValueExpression, BytesAugmentedAssignment, BytesBinaryOperation, BytesComparisonExpression, BytesConstant, BytesUnaryOperation, CheckedMaybe, CommaExpression, CompiledContract, CompiledLogicSig, ConditionalExpression, Contract, ContractMemberNodeVisitor, ContractMethod, ConvertArray, Copy, CreateInnerTransaction, DecimalConstant, Emit, Enumeration, ExpressionStatement, ExpressionVisitor, FieldExpression, ForInLoop, Goto, GroupTransactionReference, IfElse, IndexExpression, InnerTransactionField, IntegerConstant, IntersectionSliceExpression, IntrinsicCall, LogicSignature, LoopContinue, LoopExit, MethodConstant, NamedTupleExpression, NewArray, NewStruct, Not, NumericComparisonExpression, PuyaLibCall, Range, ReinterpretCast, ReturnStatement, Reversed, RootNodeVisitor, SetInnerTransactionFields, SingleEvaluation, SizeOf, SliceExpression, StageInnerTransactions, StateDelete, StateExists, StateGet, StateGetEx, StatementVisitor, StringConstant, SubmitInnerTransaction, Subroutine, SubroutineCallExpression, Switch, TemplateVar, TupleExpression, TupleItemExpression, UInt64AugmentedAssignment, UInt64BinaryOperation, UInt64PostfixUnaryOperation, UInt64UnaryOperation, UpdateInnerTransaction, VarExpression, VoidConstant, WhileLoop } from '../nodes';
|
|
1
|
+
import type { ABICall, AddressConstant, AppAccountStateExpression, AppStateExpression, AppStorageDefinition, ARC4Decode, ARC4Encode, ARC4FromBytes, ARC4Router, ArrayConcat, ArrayExtend, ArrayLength, ArrayPop, ArrayReplace, AssertExpression, AssignmentExpression, AssignmentStatement, BigUIntAugmentedAssignment, BigUIntBinaryOperation, BigUIntPostfixUnaryOperation, Block, BoolConstant, BooleanBinaryOperation, BoxPrefixedKeyExpression, BoxValueExpression, BytesAugmentedAssignment, BytesBinaryOperation, BytesComparisonExpression, BytesConstant, BytesUnaryOperation, CheckedMaybe, CommaExpression, CompiledContract, CompiledLogicSig, ConditionalExpression, Contract, ContractMemberNodeVisitor, ContractMethod, ConvertArray, Copy, CreateInnerTransaction, DecimalConstant, Emit, EmitFields, Enumeration, ExpressionStatement, ExpressionVisitor, FieldExpression, ForInLoop, Goto, GroupTransactionReference, IfElse, IndexExpression, InnerTransactionField, IntegerConstant, IntersectionSliceExpression, IntrinsicCall, LogicSignature, LoopContinue, LoopExit, MethodConstant, NamedTupleExpression, NewArray, NewStruct, Not, NumericComparisonExpression, PuyaLibCall, Range, ReinterpretCast, ReturnStatement, Reversed, RootNodeVisitor, SetInnerTransactionFields, SingleEvaluation, SizeOf, SliceExpression, StageInnerTransactions, StateDelete, StateExists, StateGet, StateGetEx, StatementVisitor, StringConstant, SubmitInnerTransaction, Subroutine, SubroutineCallExpression, Switch, TemplateVar, TupleExpression, TupleItemExpression, UInt64AugmentedAssignment, UInt64BinaryOperation, UInt64PostfixUnaryOperation, UInt64UnaryOperation, UpdateInnerTransaction, VarExpression, VoidConstant, WhileLoop } from '../nodes';
|
|
2
2
|
export declare class FunctionTraverser implements ExpressionVisitor<void>, StatementVisitor<void> {
|
|
3
3
|
visitExpressionStatement(statement: ExpressionStatement): void;
|
|
4
4
|
visitBlock(statement: Block): void;
|
|
@@ -46,6 +46,7 @@ export declare class FunctionTraverser implements ExpressionVisitor<void>, State
|
|
|
46
46
|
visitNamedTupleExpression(expression: NamedTupleExpression): void;
|
|
47
47
|
visitVarExpression(expression: VarExpression): void;
|
|
48
48
|
visitInnerTransactionField(expression: InnerTransactionField): void;
|
|
49
|
+
visitABICall(expression: ABICall): void;
|
|
49
50
|
visitSetInnerTransactionFields(expression: SetInnerTransactionFields): void;
|
|
50
51
|
visitSubmitInnerTransaction(expression: SubmitInnerTransaction): void;
|
|
51
52
|
visitSizeOf(expression: SizeOf): void;
|
|
@@ -76,6 +77,7 @@ export declare class FunctionTraverser implements ExpressionVisitor<void>, State
|
|
|
76
77
|
visitBooleanBinaryOperation(expression: BooleanBinaryOperation): void;
|
|
77
78
|
visitNot(expression: Not): void;
|
|
78
79
|
visitEmit(expression: Emit): void;
|
|
80
|
+
visitEmitFields(expression: EmitFields): void;
|
|
79
81
|
visitRange(expression: Range): void;
|
|
80
82
|
visitEnumeration(expression: Enumeration): void;
|
|
81
83
|
visitReversed(expression: Reversed): void;
|
package/awst/wtypes.d.ts
CHANGED
|
@@ -90,8 +90,15 @@ export declare namespace wtypes {
|
|
|
90
90
|
}
|
|
91
91
|
class WInnerTransactionFields extends WType {
|
|
92
92
|
transactionType: TransactionKind | null;
|
|
93
|
-
constructor({ transactionType }: {
|
|
93
|
+
constructor({ transactionType, name }: {
|
|
94
94
|
transactionType?: TransactionKind;
|
|
95
|
+
name?: string;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
class WABICallInnerTransactionFields extends WInnerTransactionFields {
|
|
99
|
+
resultType: WType;
|
|
100
|
+
constructor({ returnType }: {
|
|
101
|
+
returnType?: WType;
|
|
95
102
|
});
|
|
96
103
|
}
|
|
97
104
|
class ARC4UIntN extends ARC4Type {
|
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
import type { ResourceEncoding } from '../awst';
|
|
2
1
|
import { ARC4ABIMethodConfig } from '../awst/nodes';
|
|
3
2
|
import type { SourceLocation } from '../awst/source-location';
|
|
4
|
-
import type {
|
|
5
|
-
import { ArrayPType, FixedArrayPType, ImmutableObjectPType, MutableTuplePType, ReadonlyArrayPType, ReadonlyTuplePType } from './ptypes';
|
|
6
|
-
import { ARC4EncodedType, ARC4StructType, ARC4TupleType, DynamicArrayType, StaticArrayType } from './ptypes/arc4-types';
|
|
7
|
-
/**
|
|
8
|
-
* For a given ptype, return the equivalent ABI compatible type - or error if there is no compatible type
|
|
9
|
-
* @param ptype The type of the parameter
|
|
10
|
-
* @param direction The direction of the parameter (in for method args, out for method returns)
|
|
11
|
-
* @param resourceEncoding The encoding strategy for the foreign resource types (App, Asset, Account)
|
|
12
|
-
* @param sourceLocation The location of the method or parameter, for use in error metadata
|
|
13
|
-
*/
|
|
14
|
-
export declare function ptypeToAbiPType(ptype: PType, direction: 'in' | 'out', resourceEncoding: ResourceEncoding, sourceLocation: SourceLocation): ABICompatiblePType;
|
|
3
|
+
import type { FunctionPType } from './ptypes';
|
|
15
4
|
export declare function arc4ConfigFromType(functionType: FunctionPType, sourceLocation: SourceLocation): {
|
|
16
5
|
arc4Config: ARC4ABIMethodConfig;
|
|
17
6
|
methodSelector: import("../awst/nodes").MethodConstant;
|
|
@@ -23,29 +12,3 @@ export declare function arc4ConfigFromType(functionType: FunctionPType, sourceLo
|
|
|
23
12
|
* @param sourceLocation The source location of the code generating the constant,
|
|
24
13
|
*/
|
|
25
14
|
export declare function buildArc4MethodConstant(functionType: FunctionPType, arc4Config: ARC4ABIMethodConfig, sourceLocation: SourceLocation): import("../awst/nodes").MethodConstant;
|
|
26
|
-
/**
|
|
27
|
-
* Get the ARC4 type name for a ptype, or throw if the ptype is not usable in an ABI method.
|
|
28
|
-
* @param ptype The ptype of the parameter
|
|
29
|
-
* @param direction The direction of the parameter (in for method args, out for method returns)
|
|
30
|
-
* @param resourceEncoding The encoding strategy for the foreign resource types (App, Asset, Account)
|
|
31
|
-
* @param sourceLocation The location of the method or parameter, for use in error metadata
|
|
32
|
-
*/
|
|
33
|
-
export declare function getABITypeName(ptype: PType, direction: 'in' | 'out', resourceEncoding: ResourceEncoding, sourceLocation: SourceLocation): string;
|
|
34
|
-
/**
|
|
35
|
-
* Is the given type an ARC4 encoded type, or can it be encoded to one
|
|
36
|
-
* @param ptype The type to check
|
|
37
|
-
*/
|
|
38
|
-
export declare function isArc4EncodableType(ptype: PType): boolean;
|
|
39
|
-
/**
|
|
40
|
-
* For a given type, return the arc4 encoded version of that type
|
|
41
|
-
* @param ptype The type to be encoded
|
|
42
|
-
* @param sourceLocation The source location triggering the conversion
|
|
43
|
-
*/
|
|
44
|
-
export declare function ptypeToArc4EncodedType(ptype: ReadonlyTuplePType, sourceLocation: SourceLocation): ARC4TupleType;
|
|
45
|
-
export declare function ptypeToArc4EncodedType(ptype: MutableTuplePType, sourceLocation: SourceLocation): ARC4TupleType;
|
|
46
|
-
export declare function ptypeToArc4EncodedType(ptype: ImmutableObjectPType, sourceLocation: SourceLocation): ARC4StructType;
|
|
47
|
-
export declare function ptypeToArc4EncodedType(ptype: ArrayPType, sourceLocation: SourceLocation): DynamicArrayType;
|
|
48
|
-
export declare function ptypeToArc4EncodedType(ptype: ReadonlyArrayPType, sourceLocation: SourceLocation): DynamicArrayType;
|
|
49
|
-
export declare function ptypeToArc4EncodedType(ptype: FixedArrayPType, sourceLocation: SourceLocation): StaticArrayType;
|
|
50
|
-
export declare function ptypeToArc4EncodedType<T extends ARC4EncodedType>(ptype: T, sourceLocation: SourceLocation): T;
|
|
51
|
-
export declare function ptypeToArc4EncodedType(ptype: PType, sourceLocation: SourceLocation): ARC4EncodedType;
|