Search code examples
nearprotocol

How to create an account on NEAR protocol?


I would like to learn how to create an account using RPC or REST calls on NEAR protocol.


Solution

  • If you want to create a subaccount (a.frol.near when you own frol.near): Submit a transaction with CREATE_ACCOUNT, TRANSFER, ADD_KEY actions. Here is an example of such a transaction.

    If you want to create *.near account, you need to submit a transaction with create_account function call on near contract. Here is an example of such a transaction, and here is a code snippet from the tutorial in the docs using near-api-js JS library:

    const HELP = `Please run this script in the following format:
        node create-testnet-account.js CREATOR_ACCOUNT.testnet NEW_ACCOUNT.testnet AMOUNT
    `;
    
    const { connect, KeyPair, keyStores, utils } = require("near-api-js");
    const path = require("path");
    const homedir = require("os").homedir();
    
    const CREDENTIALS_DIR = ".near-credentials";
    const credentialsPath = path.join(homedir, CREDENTIALS_DIR);
    const keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath);
    
    const config = {
      keyStore,
      networkId: "testnet",
      nodeUrl: "https://rpc.testnet.near.org",
    };
    
    if (process.argv.length !== 5) {
      console.info(HELP);
      process.exit(1);
    }
    
    createAccount(process.argv[2], process.argv[3], process.argv[4]);
    
    async function createAccount(creatorAccountId, newAccountId, amount) {
      const near = await connect({ ...config, keyStore });
      const creatorAccount = await near.account(creatorAccountId);
      const keyPair = KeyPair.fromRandom("ed25519");
      const publicKey = keyPair.publicKey.toString();
      await keyStore.setKey(config.networkId, newAccountId, keyPair);
    
      return await creatorAccount.functionCall({
        contractId: "testnet",
        methodName: "create_account",
        args: {
          new_account_id: newAccountId,
          new_public_key: publicKey,
        },
        gas: "300000000000000",
        attachedDeposit: utils.format.parseNearAmount(amount),
      });
    }
    

    If you don't need a named account, you can just generate a new ed25519 key-pair, and the hex representation of the public key will be your account id (it won't be recorded on chain until you/someone transfers some NEAR tokens to it, and so it is called "implicit" account). Example for such an account.

    Here is a detailed tutorial on how to construct a transaction. Ultimately, you will submit your transaction via JSON RPC broadcast_tx* endpoints.