Search code examples
nearprotocol

How to detect which network your contract is on


Is it possible to detect which network (testnet, mainnet etc..) your contract is in via, for example, env in Rust? I have a contract that will be deployed to both testnet and mainnet and I have logic that depends on the network.


Solution

  • There are a two things you can do in this case that I could think of.

    1. You could store in the state of the contract which network it lives on and then pass that into the initialization function.
    2. If you wanted to use env, you could right split env::current_account_id() and check for .testnet at the end of the account ID.

    Note: This method won't work if your contract is deployed to an implicit account.

    An example of the code is:

    // Get this with env::current_account_id();
    let str = "benji.testnet.fayyr.testnet".to_string();
    // Get the split at the end of the string using `.testnet`
    let split_check = str.rsplit_once(".testnet");
    
    // Default network to mainnet
    let mut network = "mainnet";
    // If `.testnet` was found, make sure it was at the end of the account ID
    if let Some(split) = split_check {
        if split.1.len() == 0 {
           network = "testnet";
        }
    }