Skip to content

Multiple Contracts

Inheritance

You can inherit another Contract or LogicSig in order to inherit all of the class properties (state, events, scratch, etc.) and methods.

export class BaseContract extends Contract {
favoriteNumber = GlobalStateKey<uint64>()
private setNumber(n: uint64): void {
this.favoriteNumber.value = n
}
}
export class AnotherContract extends BaseContract {
checkNumber(): void {
this.setNumber(42)
assert(this.favoriteNumber.value === 42)
}
}

Importing and Inheritance

TEALScript supports importing any Contract, LogicSig, const, or type from another TEALScript file.

base_contract.algo.ts
export class BaseContract extends Contract {
favoriteNumber = GlobalStateKey<uint64>()
private setNumber(n: uint64): void {
this.favoriteNumber.value = n
}
}
another_contract.algo.ts
import { BaseContract } from './base_contract.algo.ts'
export class AnotherContract extends BaseContract {
checkNumber(): void {
this.setNumber(42)
assert(this.favoriteNumber.value === 42)
}
}

App Programs and Schema

To access the program or schema of another TEALScript app you can use the .approvalProgram(). .clearProgram(), or .schema static methods.

class TheApp extends Contract {
favoriteNumber = GlobalStateKey<uint64>();
createApplication(): void {
this.favoriteNumber.value = 42;
}
}
class TheFactory extends Contract {
createTheApp(): void {
sendMethodCall<[], void>({
name: 'createApplication',
approvalProgram: TheApp.approvalProgram(),
clearStateProgram: TheApp.clearProgram(),
globalNumUint: TheApp.schema.global.numUint,
});
}
}

Logic Signature Address and Program

class TheLsig extends LogicSig {
logic(): void {
assert(this.txn.fee === 0);
}
}
class TheApp extends Contract {
createApplication(): void {
assert(TheLsig.address().balance >= 10_000_000);
log(TheLsig.program());
}
}