Deploy Smart Contracts With Foundry and Chainstack

This section guides you through deploying a Hello World contract using Chainstack and Foundry on the testnet.

If you have any questions, reach out in the Chainstack Discord.

Deploy a Fantom Testnet Node

You need a node to deploy a smart contract to the blockchain network.

To get your node:

Install Foundry

Foundry is a development toolkit to work with smart contracts.

Initialize with Foundry

In your project directory, run foundry init.

This will create a boilerplate project.

Fund Your Account

You need to pay gas on the network to deploy the contract.

Get testnet Fantom through the faucet.

Create the Hello World contract

In the initialized Foundry project in src/, create HelloWorld.sol:

// SPDX-License-Identifier: None

// Specifies the version of Solidity, using semantic versioning.
// Learn more:
pragma solidity >=0.8.9;

// Defines a contract named `HelloWorld`.
// A contract is a collection of functions and data (its state). Once deployed, a contract resides at a specific address on the Fantom blockchain. Learn more:
contract HelloWorld {

   //Emitted when update function is called
   //Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen.
   event UpdatedMessages(string oldStr, string newStr);

   // Declares a state variable `message` of type `string`.
   // State variables are variables whose values are permanently stored in contract storage. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value.
   string public message;

   // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation.
   // Constructors are used to initialize the contract's data. Learn more:
   constructor(string memory initMessage) {

      // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable).
      message = initMessage;

   // A public function that accepts a string argument and updates the `message` storage variable.
   function update(string memory newMessage) public {
      string memory oldMsg = message;
      message = newMessage;
      emit UpdatedMessages(oldMsg, newMessage);

Deploy the Contract

At this point, you are ready to deploy your contract:

  • You have your own node on the Fantom testnet network through which you will deploy the contract.

  • You have Foundry that you will use to deploy the contract.

  • You have a funded account that will deploy the contract.

To deploy the contract, run:

forge create HelloWorld --constructor-args "Hello" --contracts CONTRACT_PATH --private-key PRIVATE_KEY --rpc-url HTTPS_ENDPOINT


  • CONTRACT_PATH — path to your HelloWorld.sol file.

  • PRIVATE_KEY — the private key from your account.

  • HTTPS_ENDPOINT — your node's endpoint.


forge create HelloWorld --constructor-args "Hello" --contracts /root/foundry/src/HelloWorld.sol --private-key d8936f6eae35c73a14ea7c1aabb8d068e16889a7f516c8abc482ba4e1489f4cd --rpc-url

Congratulations! You have deployed your Hello World smart contract on Fantom!

See also Chainstack docs for more tutorials and tools.

Last updated

© 2024 Fantom Foundation