Skip to content

Commit

Permalink
fix: Allow template vars as module constants
Browse files Browse the repository at this point in the history
  • Loading branch information
tristanmenzel committed Feb 24, 2025
1 parent 6f033fd commit 5087dd1
Show file tree
Hide file tree
Showing 25 changed files with 832 additions and 378 deletions.
11 changes: 8 additions & 3 deletions src/awst_build/ast-visitors/source-file-visitor.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import ts from 'typescript'
import { isConstant } from '../../awst'
import type * as awst from '../../awst/nodes'
import { TemplateVar } from '../../awst/nodes'
import { CodeError } from '../../errors'
import { logger, patchErrorLocation } from '../../logger'
import { expandMaybeArray, invariant } from '../../util'
import { codeInvariant, expandMaybeArray, invariant } from '../../util'
import type { ModuleStatements } from '../../visitor/syntax-names'
import type { Visitor } from '../../visitor/visitor'
import { accept } from '../../visitor/visitor'
import { requireConstantOfType } from '../eb/util'
import { requireExpressionOfType } from '../eb/util'
import { ContractClassPType, LibClassType, LogicSigPType } from '../ptypes'
import { ARC4StructType } from '../ptypes/arc4-types'
import { BaseVisitor } from './base-visitor'
Expand Down Expand Up @@ -94,7 +96,10 @@ export class SourceFileVisitor extends BaseVisitor implements Visitor<ModuleStat
return []
}

const value = requireConstantOfType(initializerBuilder, ptype, 'Module level assignments must be compile time constants')
const value = requireExpressionOfType(initializerBuilder, ptype)

codeInvariant(isConstant(value) || value instanceof TemplateVar, 'Module level assignments must be compile time constants')

this.context.addConstant(dec.name, value)

return []
Expand Down
6 changes: 3 additions & 3 deletions src/awst_build/constant-store.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import ts, { SymbolFlags } from 'typescript'
import type { Constant } from '../awst/nodes'
import type { Constant, TemplateVar } 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>()
#constants = new Map<ts.Symbol, Constant | TemplateVar>()
#typeChecker: ts.TypeChecker
constructor(program: ts.Program) {
this.#typeChecker = program.getTypeChecker()
Expand All @@ -21,7 +21,7 @@ export class ConstantStore {
return this.#constants.get(symbol)
}

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

Expand Down
6 changes: 3 additions & 3 deletions src/awst_build/context/awst-build-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import ts from 'typescript'
import type { awst } from '../../awst'
import type { ContractReference, LogicSigReference } from '../../awst/models'
import { nodeFactory } from '../../awst/node-factory'
import type { AppStorageDefinition, ARC4MethodConfig, Constant } from '../../awst/nodes'
import type { AppStorageDefinition, ARC4MethodConfig } from '../../awst/nodes'
import { SourceLocation } from '../../awst/source-location'
import { logger } from '../../logger'
import { invariant } from '../../util'
Expand Down Expand Up @@ -70,7 +70,7 @@ export abstract class AwstBuildContext {
* @param identifier The identifier of the constant declaration in this source file
* @param value The compile time constant value
*/
abstract addConstant(identifier: ts.Identifier, value: awst.Constant): void
abstract addConstant(identifier: ts.Identifier, value: awst.Constant | awst.TemplateVar): void

/**
* Retrieve the evaluation context
Expand Down Expand Up @@ -194,7 +194,7 @@ class AwstBuildContextImpl extends AwstBuildContext {
)
}

addConstant(identifier: ts.Identifier, value: Constant) {
addConstant(identifier: ts.Identifier, value: awst.Constant | awst.TemplateVar) {
this.constants.addConstant(identifier, value, this.getSourceLocation(identifier))
}

Expand Down
61 changes: 40 additions & 21 deletions tests/approvals/out/o1/template-var/MyContract.approval.teal
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,52 @@
// @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram() -> uint64:
main:
intcblock 1 TMPL_AN_INT
bytecblock 0x151f7c75 TMPL_SOME_BYTES TMPL_A_STRING
// tests/approvals/template-var.algo.ts:4
bytecblock 0x151f7c75 TMPL_AN_ADDRESS TMPL_SOME_BYTES TMPL_A_STRING
// tests/approvals/template-var.algo.ts:7
// export class MyContract extends Contract {
txn NumAppArgs
bz main_bare_routing@8
pushbytess 0xbe93200b 0xc1a13295 0xaf43db36 // method "getInt()uint64", method "getString()string", method "getBytes()byte[]"
bz main_bare_routing@9
pushbytess 0xbe93200b 0xc1a13295 0xaf43db36 0x0559cac1 // method "getInt()uint64", method "getString()string", method "getBytes()byte[]", method "getAddress()address"
txna ApplicationArgs 0
match main_getInt_route@3 main_getString_route@4 main_getBytes_route@5
match main_getInt_route@3 main_getString_route@4 main_getBytes_route@5 main_getAddress_route@6

main_after_if_else@12:
// tests/approvals/template-var.algo.ts:4
main_after_if_else@13:
// tests/approvals/template-var.algo.ts:7
// export class MyContract extends Contract {
pushint 0 // 0
return

main_getAddress_route@6:
// tests/approvals/template-var.algo.ts:20
// getAddress() {
txn OnCompletion
!
assert // OnCompletion is not NoOp
txn ApplicationID
assert // can only call when not creating
bytec_0 // 0x151f7c75
// tests/approvals/template-var.algo.ts:5
// const specialAddress = TemplateVar<Address>('AN_ADDRESS')
bytec_1 // TMPL_AN_ADDRESS
// tests/approvals/template-var.algo.ts:20
// getAddress() {
concat
log
intc_0 // 1
return

main_getBytes_route@5:
// tests/approvals/template-var.algo.ts:13
// tests/approvals/template-var.algo.ts:16
// getBytes() {
txn OnCompletion
!
assert // OnCompletion is not NoOp
txn ApplicationID
assert // can only call when not creating
// tests/approvals/template-var.algo.ts:14
// tests/approvals/template-var.algo.ts:17
// return TemplateVar<bytes>('SOME_BYTES')
bytec_1 // TMPL_SOME_BYTES
// tests/approvals/template-var.algo.ts:13
bytec_2 // TMPL_SOME_BYTES
// tests/approvals/template-var.algo.ts:16
// getBytes() {
dup
len
Expand All @@ -46,17 +65,17 @@ main_getBytes_route@5:
return

main_getString_route@4:
// tests/approvals/template-var.algo.ts:9
// tests/approvals/template-var.algo.ts:12
// getString() {
txn OnCompletion
!
assert // OnCompletion is not NoOp
txn ApplicationID
assert // can only call when not creating
// tests/approvals/template-var.algo.ts:10
// tests/approvals/template-var.algo.ts:13
// return TemplateVar<string>('A_STRING')
bytec_2 // TMPL_A_STRING
// tests/approvals/template-var.algo.ts:9
bytec_3 // TMPL_A_STRING
// tests/approvals/template-var.algo.ts:12
// getString() {
dup
len
Expand All @@ -72,17 +91,17 @@ main_getString_route@4:
return

main_getInt_route@3:
// tests/approvals/template-var.algo.ts:5
// tests/approvals/template-var.algo.ts:8
// getInt() {
txn OnCompletion
!
assert // OnCompletion is not NoOp
txn ApplicationID
assert // can only call when not creating
// tests/approvals/template-var.algo.ts:6
// tests/approvals/template-var.algo.ts:9
// return TemplateVar<uint64>('AN_INT')
intc_1 // TMPL_AN_INT
// tests/approvals/template-var.algo.ts:5
// tests/approvals/template-var.algo.ts:8
// getInt() {
itob
bytec_0 // 0x151f7c75
Expand All @@ -92,11 +111,11 @@ main_getInt_route@3:
intc_0 // 1
return

main_bare_routing@8:
// tests/approvals/template-var.algo.ts:4
main_bare_routing@9:
// tests/approvals/template-var.algo.ts:7
// export class MyContract extends Contract {
txn OnCompletion
bnz main_after_if_else@12
bnz main_after_if_else@13
txn ApplicationID
!
assert // can only call when creating
Expand Down
15 changes: 14 additions & 1 deletion tests/approvals/out/o1/template-var/MyContract.arc32.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,15 @@
"call_config": {
"no_op": "CALL"
}
},
"getAddress()address": {
"call_config": {
"no_op": "CALL"
}
}
},
"source": {
"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSBUTVBMX0FOX0lOVAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IFRNUExfU09NRV9CWVRFUyBUTVBMX0FfU1RSSU5HCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvdGVtcGxhdGUtdmFyLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIE15Q29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAOAogICAgcHVzaGJ5dGVzcyAweGJlOTMyMDBiIDB4YzFhMTMyOTUgMHhhZjQzZGIzNiAvLyBtZXRob2QgImdldEludCgpdWludDY0IiwgbWV0aG9kICJnZXRTdHJpbmcoKXN0cmluZyIsIG1ldGhvZCAiZ2V0Qnl0ZXMoKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fZ2V0SW50X3JvdXRlQDMgbWFpbl9nZXRTdHJpbmdfcm91dGVANCBtYWluX2dldEJ5dGVzX3JvdXRlQDUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy90ZW1wbGF0ZS12YXIuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgTXlDb250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHB1c2hpbnQgMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0Qnl0ZXNfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy90ZW1wbGF0ZS12YXIuYWxnby50czoxMwogICAgLy8gZ2V0Qnl0ZXMoKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy90ZW1wbGF0ZS12YXIuYWxnby50czoxNAogICAgLy8gcmV0dXJuIFRlbXBsYXRlVmFyPGJ5dGVzPignU09NRV9CWVRFUycpCiAgICBieXRlY18xIC8vIFRNUExfU09NRV9CWVRFUwogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjEzCiAgICAvLyBnZXRCeXRlcygpIHsKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldFN0cmluZ19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjkKICAgIC8vIGdldFN0cmluZygpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjEwCiAgICAvLyByZXR1cm4gVGVtcGxhdGVWYXI8c3RyaW5nPignQV9TVFJJTkcnKQogICAgYnl0ZWNfMiAvLyBUTVBMX0FfU1RSSU5HCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvdGVtcGxhdGUtdmFyLmFsZ28udHM6OQogICAgLy8gZ2V0U3RyaW5nKCkgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0SW50X3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvdGVtcGxhdGUtdmFyLmFsZ28udHM6NQogICAgLy8gZ2V0SW50KCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvdGVtcGxhdGUtdmFyLmFsZ28udHM6NgogICAgLy8gcmV0dXJuIFRlbXBsYXRlVmFyPHVpbnQ2ND4oJ0FOX0lOVCcpCiAgICBpbnRjXzEgLy8gVE1QTF9BTl9JTlQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy90ZW1wbGF0ZS12YXIuYWxnby50czo1CiAgICAvLyBnZXRJbnQoKSB7CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A4OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4K",
"approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSBUTVBMX0FOX0lOVAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IFRNUExfQU5fQUREUkVTUyBUTVBMX1NPTUVfQllURVMgVE1QTF9BX1NUUklORwogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBNeUNvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHhiZTkzMjAwYiAweGMxYTEzMjk1IDB4YWY0M2RiMzYgMHgwNTU5Y2FjMSAvLyBtZXRob2QgImdldEludCgpdWludDY0IiwgbWV0aG9kICJnZXRTdHJpbmcoKXN0cmluZyIsIG1ldGhvZCAiZ2V0Qnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0QWRkcmVzcygpYWRkcmVzcyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fZ2V0SW50X3JvdXRlQDMgbWFpbl9nZXRTdHJpbmdfcm91dGVANCBtYWluX2dldEJ5dGVzX3JvdXRlQDUgbWFpbl9nZXRBZGRyZXNzX3JvdXRlQDYKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy90ZW1wbGF0ZS12YXIuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgTXlDb250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHB1c2hpbnQgMCAvLyAwCiAgICByZXR1cm4KCm1haW5fZ2V0QWRkcmVzc19yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjIwCiAgICAvLyBnZXRBZGRyZXNzKCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy90ZW1wbGF0ZS12YXIuYWxnby50czo1CiAgICAvLyBjb25zdCBzcGVjaWFsQWRkcmVzcyA9IFRlbXBsYXRlVmFyPEFkZHJlc3M+KCdBTl9BRERSRVNTJykKICAgIGJ5dGVjXzEgLy8gVE1QTF9BTl9BRERSRVNTCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvdGVtcGxhdGUtdmFyLmFsZ28udHM6MjAKICAgIC8vIGdldEFkZHJlc3MoKSB7CiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRCeXRlc19yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjE2CiAgICAvLyBnZXRCeXRlcygpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjE3CiAgICAvLyByZXR1cm4gVGVtcGxhdGVWYXI8Ynl0ZXM+KCdTT01FX0JZVEVTJykKICAgIGJ5dGVjXzIgLy8gVE1QTF9TT01FX0JZVEVTCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvdGVtcGxhdGUtdmFyLmFsZ28udHM6MTYKICAgIC8vIGdldEJ5dGVzKCkgewogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0U3RyaW5nX3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvdGVtcGxhdGUtdmFyLmFsZ28udHM6MTIKICAgIC8vIGdldFN0cmluZygpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjEzCiAgICAvLyByZXR1cm4gVGVtcGxhdGVWYXI8c3RyaW5nPignQV9TVFJJTkcnKQogICAgYnl0ZWNfMyAvLyBUTVBMX0FfU1RSSU5HCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvdGVtcGxhdGUtdmFyLmFsZ28udHM6MTIKICAgIC8vIGdldFN0cmluZygpIHsKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX2dldEludF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjgKICAgIC8vIGdldEludCgpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL3RlbXBsYXRlLXZhci5hbGdvLnRzOjkKICAgIC8vIHJldHVybiBUZW1wbGF0ZVZhcjx1aW50NjQ+KCdBTl9JTlQnKQogICAgaW50Y18xIC8vIFRNUExfQU5fSU5UCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvdGVtcGxhdGUtdmFyLmFsZ28udHM6OAogICAgLy8gZ2V0SW50KCkgewogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy90ZW1wbGF0ZS12YXIuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgTXlDb250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCg==",
"clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="
},
"state": {
Expand Down Expand Up @@ -66,6 +71,14 @@
"returns": {
"type": "byte[]"
}
},
{
"name": "getAddress",
"args": [],
"readonly": false,
"returns": {
"type": "address"
}
}
],
"networks": {}
Expand Down
Loading

0 comments on commit 5087dd1

Please sign in to comment.