Contracts Management
⚠️ Required: Your project must follow the required structure and it must be initialized to use the following functions.
deployContractByName(props)
Deploys contract code located inside a Cadence file. Returns the transaction result.
Arguments
Props object accepts the following fields:
| Name | Type | Optional | Description | 
|---|---|---|---|
| name | string | name of the file in contractsfolder (with.cdcextension) and name of the contract (please note those should be the same) | |
| to | Address | ✅ | (optional) account address, where contract will be deployed. If this is not specified, framework will create new account with randomized alias. | 
| addressMap | AddressMap | ✅ | (optional) object to use for address mapping of existing deployed contracts | 
| args | [Any] | ✅ | (optional) arguments, which will be passed to contract initializer. (optional) if template does not expect any arguments. | 
| update | boolean | ✅ | (optional) whether to update deployed contract. Default: false | 
| transformers | [CadenceTransformer] | ✅ | an array of operators to modify the code, before submitting it to network | 
Returns
| Type | Description | 
|---|---|
| ResponseObject | Result of the deploying transaction. | 
Usage
_27import path from "path";_27import { init, emulator, deployContractByName } from "@onflow/flow-js-testing";_27_27const main = async () => {_27  const basePath = path.resolve(__dirname, "../cadence");_27_27  await init(basePath);_27  await emulator.start();_27_27  // We will deploy our contract to the address that corresponds to "Alice" alias_27  const to = await getAccountAddress("Alice");_27_27  // We assume there is a file on "../cadence/contracts/Wallet.cdc" path_27  const name = "Wallet";_27_27  // Arguments will be processed and type matched in the same order as they are specified_27  // inside of a contract template_27  const args = [1337, "Hello", { name: "Alice" }];_27_27  const [deploymentResult, err] = await deployContractByName({ to, name });_27  console.log({ deploymentResult }, { err });_27  }_27_27  await emulator.stop();_27};_27_27main();
In a bit more rare case you would want to deploy contract code not from existing template file, but rather
from string representation of it. deployContract method will help you achieve this.
deployContract(props)
Deploys contract code specified as string. Returns the transaction result.
Arguments
Props object accepts the following fields:
| Name | Type | Optional | Description | 
|---|---|---|---|
| contractCode | string | string representation of contract | |
| name | string | name of the contract to be deployed. Should be the same as the name of the contract provided in contractCode | |
| to | Address | ✅ | account address, where contract will be deployed. If this is not specified, framework will create new account with randomized alias. | 
| addressMap | AddressMap | ✅ | object to use for import resolver. Default: {} | 
| args | [Any] | ✅ | arguments, which will be passed to contract initializer. Default: [] | 
| update | boolean | ✅ | whether to update deployed contract. Default: false | 
| transformers | [CadenceTransformer] | ✅ | an array of operators to modify the code, before submitting it to network | 
Returns
| Type | Description | 
|---|---|
| ResponseObject | Result of the deploying transaction. | 
Usage
_42import path from "path"_42import {_42  init,_42  emulator,_42  getAccountAddress,_42  deployContract,_42  executeScript,_42} from "@onflow/flow-js-testing"_42;(async () => {_42  const basePath = path.resolve(__dirname, "../cadence")_42_42  await init(basePath)_42  await emulator.start()_42_42  // We can specify, which account will hold the contract_42  const to = await getAccountAddress("Alice")_42_42  const name = "Wallet"_42  const code = `_42        access(all) contract Wallet{_42            access(all) let balance: UInt_42            init(balance: UInt){_42              self.balance = balance_42            }_42        }_42    `_42  const args = [1337]_42_42  await deployContract({to, name, code, args})_42_42  const [balance, err] = await executeScript({_42    code: `_42      import Wallet from 0x01_42      access(all) fun main(): UInt{_42        return Wallet.balance_42      }_42    `,_42  })_42  console.log({balance}, {err})_42_42  await emulator.stop()_42})()
While framework have automatic import resolver for Contracts you might want to know where it's currently deployed.
We provide a method getContractAddress for this.
getContractAddress(name)
Returns address of the account where the contract is currently deployed.
Arguments
| Name | Type | Description | 
|---|---|---|
| name | string | name of the contract | 
Returns
| Type | Description | 
|---|---|
| Address | 0xprefixed address | 
Usage
_17import path from "path"_17import {init, emulator, deployContractByName, getContractAddress} from "../src"_17;(async () => {_17  const basePath = path.resolve(__dirname, "./cadence")_17_17  await init(basePath)_17  await emulator.start()_17_17  // if we omit "to" it will be deployed to Service Account_17  // but let's pretend we don't know where it will be deployed :)_17  await deployContractByName({name: "Hello"})_17_17  const contractAddress = await getContractAddress("Hello")_17  console.log({contractAddress})_17_17  await emulator.stop()_17})()
📣 Framework does not support contracts with identical names deployed to different accounts. While you can deploy contract to a new address, the internal system, which tracks where contracts are deployed, will only store last address.