Skip to content

Commit

Permalink
fix: Importing consts from external files
Browse files Browse the repository at this point in the history
  • Loading branch information
tristanmenzel committed Nov 12, 2024
1 parent b13fbd1 commit d7f0fd5
Show file tree
Hide file tree
Showing 22 changed files with 1,934 additions and 701 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"dev:examples": "tsx src/cli.ts build examples --output-awst --output-awst-json",
"dev:approvals": "rimraf tests/approvals/out && tsx src/cli.ts build tests/approvals --output-awst --output-awst-json --no-output-teal --output-ssa-ir --out-dir out/[name]",
"dev:expected-output": "tsx src/cli.ts build tests/expected-output --dry-run",
"dev:testing": "tsx src/cli.ts build tests/approvals/arc4-types.algo.ts --output-awst --output-awst-json --output-ssa-ir --log-level=info --log-level debug --out-dir out/[name]",
"dev:testing": "tsx src/cli.ts build tests/approvals/shadowed-variables.algo.ts --output-awst --output-awst-json --output-ssa-ir --log-level=info --log-level debug --out-dir out/[name]",
"audit": "better-npm-audit audit",
"format": "prettier --write .",
"lint": "eslint \"src/**/*.ts\"",
Expand Down
36 changes: 36 additions & 0 deletions src/awst_build/constant-store.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import ts, { SymbolFlags } from 'typescript'
import type { Constant } from '../awst/nodes'
import type { SourceLocation } from '../awst/source-location'
import { CodeError } from '../errors'
import { logger } from '../logger'
import { hasFlags, invariant } from '../util'

export class ConstantStore {
#constants = new Map<ts.Symbol, Constant>()
#typeChecker: ts.TypeChecker
constructor(program: ts.Program) {
this.#typeChecker = program.getTypeChecker()
}

tryResolveConstant(node: ts.Identifier) {
let symbol = this.#typeChecker.resolveName(node.text, node, SymbolFlags.All, true)
if (!symbol) return undefined
if (hasFlags(symbol.flags, ts.SymbolFlags.Alias)) {
symbol = this.#typeChecker.getAliasedSymbol(symbol)
}
return this.#constants.get(symbol)
}

addConstant(identifier: ts.Identifier, value: Constant, constantLocation: SourceLocation) {
const symbol = this.#typeChecker.resolveName(identifier.text, identifier, ts.SymbolFlags.All, false)
invariant(symbol, 'Constant identifier must resolve to a symbol')

if (this.#constants.has(symbol)) {
logger.error(new CodeError(`Duplicate definitions found for constant ${identifier.text}`, { sourceLocation: constantLocation }))
return
}
const exportSymbol = this.#typeChecker.getExportSymbolOfSymbol(symbol)
this.#constants.set(symbol, value)
if (exportSymbol !== symbol) this.#constants.set(exportSymbol, value)
}
}
28 changes: 11 additions & 17 deletions src/awst_build/context/awst-build-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import type { ContractReference, LogicSigReference } from '../../awst/models'
import { nodeFactory } from '../../awst/node-factory'
import type { AppStorageDefinition, Constant } from '../../awst/nodes'
import { SourceLocation } from '../../awst/source-location'
import { CodeError } from '../../errors'
import { logger } from '../../logger'
import { codeInvariant, invariant } from '../../util'
import { invariant } from '../../util'
import { ConstantStore } from '../constant-store'
import type { AppStorageDeclaration } from '../contract-data'
import type { NodeBuilder } from '../eb'
import type { Index, LogicSig } from '../models'
Expand Down Expand Up @@ -64,10 +64,10 @@ export interface AwstBuildContext {

/**
* Add a named constant to the current context
* @param name The unique name of the constant declaration in this source file
* @param identifier The identifier of the constant declaration in this source file
* @param value The compile time constant value
*/
addConstant(name: string, value: awst.Constant): void
addConstant(identifier: ts.Identifier, value: awst.Constant): void

/**
* Retrieve the evaluation context
Expand Down Expand Up @@ -108,7 +108,7 @@ class AwstBuildContextImpl implements AwstBuildContext {
readonly #compilationSet: CompilationSet
private constructor(
public readonly program: ts.Program,
private readonly constants: Map<string, awst.Constant>,
private readonly constants: ConstantStore,
private readonly nameResolver: UniqueNameResolver,
private readonly storageDeclarations: Map<string, Map<string, AppStorageDeclaration>>,
compilationSet: CompilationSet,
Expand All @@ -119,21 +119,17 @@ class AwstBuildContextImpl implements AwstBuildContext {
}

static forProgram(program: ts.Program): AwstBuildContext {
return new AwstBuildContextImpl(program, new Map(), new UniqueNameResolver(), new Map(), new CompilationSet())
return new AwstBuildContextImpl(program, new ConstantStore(program), new UniqueNameResolver(), new Map(), new CompilationSet())
}

addConstant(name: string, value: Constant) {
if (this.constants.has(name)) {
logger.error(new CodeError(`Duplicate definitions found for constant ${name}`, { sourceLocation: value.sourceLocation }))
return
}
this.constants.set(name, value)
addConstant(identifier: ts.Identifier, value: Constant) {
this.constants.addConstant(identifier, value, this.getSourceLocation(identifier))
}

createChildContext(): AwstBuildContext {
return new AwstBuildContextImpl(
this.program,
new Map(this.constants),
this.constants,
this.nameResolver.createChild(),
this.storageDeclarations,
this.#compilationSet,
Expand All @@ -149,7 +145,6 @@ class AwstBuildContextImpl implements AwstBuildContext {
return this.nameResolver.resolveUniqueName('_', undefined)
}
resolveVariableName(node: ts.Identifier) {
codeInvariant(ts.isIdentifier(node), 'Only basic identifiers supported for now')
const symbol = this.typeChecker.resolveName(node.text, node, ts.SymbolFlags.All, false)
invariant(symbol, 'There must be a symbol for an identifier node')
return this.nameResolver.resolveUniqueName(node.text, symbol)
Expand All @@ -170,15 +165,14 @@ class AwstBuildContextImpl implements AwstBuildContext {
getBuilderForNode(node: ts.Identifier): NodeBuilder {
const sourceLocation = this.getSourceLocation(node)
const ptype = this.typeResolver.resolve(node, sourceLocation)

if (ptype.singleton) {
return typeRegistry.getSingletonEb(ptype, sourceLocation)
}
const variableName = this.resolveVariableName(node)
const constantValue = this.constants.get(variableName)
const constantValue = this.constants.tryResolveConstant(node)
if (constantValue) {
return typeRegistry.getInstanceEb(constantValue, ptype)
}
const variableName = this.resolveVariableName(node)
return typeRegistry.getInstanceEb(
nodeFactory.varExpression({
sourceLocation,
Expand Down
3 changes: 1 addition & 2 deletions src/awst_build/source-file-visitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,7 @@ export class SourceFileVisitor extends BaseVisitor implements Visitor<ModuleStat
}

const value = requireConstantOfType(initializerBuilder, ptype, 'Module level assignments must be compile time constants')
const constantName = this.context.resolveVariableName(dec.name)
this.context.addConstant(constantName, value)
this.context.addConstant(dec.name, value)

return []
})
Expand Down
2 changes: 2 additions & 0 deletions tests/approvals/inheritance-a.algo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,5 @@ export abstract class Arc4Contract extends Contract {
return a + b
}
}

export const VERY_IMPORTANT_VALUE = '42'
13 changes: 9 additions & 4 deletions tests/approvals/inheritance-b.algo.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import type { uint64 } from '@algorandfoundation/algorand-typescript'
import { op, Txn } from '@algorandfoundation/algorand-typescript'
import { Arc4Contract, SimpleContract } from './inheritance-a.algo'
import { log, op, Txn } from '@algorandfoundation/algorand-typescript'
import { Arc4Contract, SimpleContract, VERY_IMPORTANT_VALUE } from './inheritance-a.algo'

export class ConcreteSimpleContract extends SimpleContract {
public approvalProgram(): uint64 {
const a = op.btoi(Txn.applicationArgs(0))
const b = op.btoi(Txn.applicationArgs(1))
return this.simpleMethod(a, b)
log(this.simpleMethod(a, b))
return 1
}
}

export class ConcreteArc4Contract extends Arc4Contract {}
export class ConcreteArc4Contract extends Arc4Contract {
public getVeryImportantValue() {
return VERY_IMPORTANT_VALUE
}
}
152 changes: 0 additions & 152 deletions tests/approvals/out/arc4-types/Arc4TypesTestContract.approval.teal

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
{
"hints": {
"getVeryImportantValue()string": {
"call_config": {
"no_op": "CALL"
}
},
"simpleAbiMethod(uint64,uint64)uint64": {
"call_config": {
"no_op": "CALL"
}
}
},
"source": {
"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYi5hbGdvLnRzOjpDb25jcmV0ZUFyYzRDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYi5hbGdvLnRzOjpDb25jcmV0ZUFyYzRDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYi5hbGdvLnRzOjEzCiAgICAvLyBleHBvcnQgY2xhc3MgQ29uY3JldGVBcmM0Q29udHJhY3QgZXh0ZW5kcyBBcmM0Q29udHJhY3Qge30KICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHhmMTYxZGMzNyAvLyBtZXRob2QgInNpbXBsZUFiaU1ldGhvZCh1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NpbXBsZUFiaU1ldGhvZF9yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zaW1wbGVBYmlNZXRob2Rfcm91dGVAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1hLmFsZ28udHM6MTcKICAgIC8vIHB1YmxpYyBzaW1wbGVBYmlNZXRob2QoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2luaGVyaXRhbmNlLWIuYWxnby50czoxMwogICAgLy8gZXhwb3J0IGNsYXNzIENvbmNyZXRlQXJjNENvbnRyYWN0IGV4dGVuZHMgQXJjNENvbnRyYWN0IHt9CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYS5hbGdvLnRzOjE3CiAgICAvLyBwdWJsaWMgc2ltcGxlQWJpTWV0aG9kKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIGNhbGxzdWIgc2ltcGxlQWJpTWV0aG9kCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2luaGVyaXRhbmNlLWIuYWxnby50czoxMwogICAgLy8gZXhwb3J0IGNsYXNzIENvbmNyZXRlQXJjNENvbnRyYWN0IGV4dGVuZHMgQXJjNENvbnRyYWN0IHt9CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYi5hbGdvLnRzOjEzCiAgICAvLyBleHBvcnQgY2xhc3MgQ29uY3JldGVBcmM0Q29udHJhY3QgZXh0ZW5kcyBBcmM0Q29udHJhY3Qge30KICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYS5hbGdvLnRzOjpBcmM0Q29udHJhY3Quc2ltcGxlQWJpTWV0aG9kKGE6IHVpbnQ2NCwgYjogdWludDY0KSAtPiB1aW50NjQ6CnNpbXBsZUFiaU1ldGhvZDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1hLmFsZ28udHM6MTcKICAgIC8vIHB1YmxpYyBzaW1wbGVBYmlNZXRob2QoYTogdWludDY0LCBiOiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYS5hbGdvLnRzOjE4CiAgICAvLyByZXR1cm4gYSArIGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICByZXRzdWIK",
"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYi5hbGdvLnRzOjpDb25jcmV0ZUFyYzRDb250cmFjdC5hcHByb3ZhbFByb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1iLmFsZ28udHM6OkNvbmNyZXRlQXJjNENvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1iLmFsZ28udHM6MTQKICAgIC8vIGV4cG9ydCBjbGFzcyBDb25jcmV0ZUFyYzRDb250cmFjdCBleHRlbmRzIEFyYzRDb250cmFjdCB7CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweGM3M2RhOWI5IDB4ZjE2MWRjMzcgLy8gbWV0aG9kICJnZXRWZXJ5SW1wb3J0YW50VmFsdWUoKXN0cmluZyIsIG1ldGhvZCAic2ltcGxlQWJpTWV0aG9kKHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0VmVyeUltcG9ydGFudFZhbHVlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fc2ltcGxlQWJpTWV0aG9kX3JvdXRlQDMKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldFZlcnlJbXBvcnRhbnRWYWx1ZV9yb3V0ZUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2luaGVyaXRhbmNlLWIuYWxnby50czoxNQogICAgLy8gcHVibGljIGdldFZlcnlJbXBvcnRhbnRWYWx1ZSgpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0VmVyeUltcG9ydGFudFZhbHVlCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2ltcGxlQWJpTWV0aG9kX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYS5hbGdvLnRzOjE3CiAgICAvLyBwdWJsaWMgc2ltcGxlQWJpTWV0aG9kKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1iLmFsZ28udHM6MTQKICAgIC8vIGV4cG9ydCBjbGFzcyBDb25jcmV0ZUFyYzRDb250cmFjdCBleHRlbmRzIEFyYzRDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYS5hbGdvLnRzOjE3CiAgICAvLyBwdWJsaWMgc2ltcGxlQWJpTWV0aG9kKGE6IHVpbnQ2NCwgYjogdWludDY0KTogdWludDY0IHsKICAgIGNhbGxzdWIgc2ltcGxlQWJpTWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1iLmFsZ28udHM6MTQKICAgIC8vIGV4cG9ydCBjbGFzcyBDb25jcmV0ZUFyYzRDb250cmFjdCBleHRlbmRzIEFyYzRDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1iLmFsZ28udHM6MTQKICAgIC8vIGV4cG9ydCBjbGFzcyBDb25jcmV0ZUFyYzRDb250cmFjdCBleHRlbmRzIEFyYzRDb250cmFjdCB7CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2luaGVyaXRhbmNlLWIuYWxnby50czo6Q29uY3JldGVBcmM0Q29udHJhY3QuZ2V0VmVyeUltcG9ydGFudFZhbHVlKCkgLT4gYnl0ZXM6CmdldFZlcnlJbXBvcnRhbnRWYWx1ZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1iLmFsZ28udHM6MTUKICAgIC8vIHB1YmxpYyBnZXRWZXJ5SW1wb3J0YW50VmFsdWUoKSB7CiAgICBwcm90byAwIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1hLmFsZ28udHM6MjIKICAgIC8vIGV4cG9ydCBjb25zdCBWRVJZX0lNUE9SVEFOVF9WQUxVRSA9ICc0MicKICAgIHB1c2hieXRlcyAiNDIiCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYi5hbGdvLnRzOjE2CiAgICAvLyByZXR1cm4gVkVSWV9JTVBPUlRBTlRfVkFMVUUKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1hLmFsZ28udHM6OkFyYzRDb250cmFjdC5zaW1wbGVBYmlNZXRob2QoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKc2ltcGxlQWJpTWV0aG9kOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2luaGVyaXRhbmNlLWEuYWxnby50czoxNwogICAgLy8gcHVibGljIHNpbXBsZUFiaU1ldGhvZChhOiB1aW50NjQsIGI6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9pbmhlcml0YW5jZS1hLmFsZ28udHM6MTgKICAgIC8vIHJldHVybiBhICsgYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIHJldHN1Ygo=",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0cy9hcHByb3ZhbHMvaW5oZXJpdGFuY2UtYi5hbGdvLnRzOjpDb25jcmV0ZUFyYzRDb250cmFjdC5jbGVhclN0YXRlUHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K"
},
"state": {
Expand Down Expand Up @@ -38,6 +43,14 @@
"contract": {
"name": "ConcreteArc4Contract",
"methods": [
{
"name": "getVeryImportantValue",
"args": [],
"readonly": false,
"returns": {
"type": "string"
}
},
{
"name": "simpleAbiMethod",
"args": [
Expand Down
Loading

0 comments on commit d7f0fd5

Please sign in to comment.