From 91833e8d520da258345dad3cd167a07fce68a1a2 Mon Sep 17 00:00:00 2001 From: Benjamin Smith Date: Mon, 1 Jul 2024 15:53:51 +0200 Subject: [PATCH] Remove dotenv Constructors (#70) --- README.md | 15 ++++++++++--- examples/setup.ts | 19 ++++++++++++++--- src/chains/near.ts | 53 ++++++++++++++-------------------------------- src/mpcContract.ts | 15 +++++-------- 4 files changed, 49 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 5718f03..b63d018 100644 --- a/README.md +++ b/README.md @@ -80,19 +80,28 @@ import dotenv from "dotenv"; import { MultichainContract, NearEthAdapter, - nearAccountFromEnv, + nearAccountFromKeyPair, } from "near-ca"; +import { KeyPair } from "near-api-js"; dotenv.config(); +const { NEAR_ACCOUNT_ID, NEAR_ACCOUNT_PRIVATE_KEY } = process.env; -const account = await nearAccountFromEnv(); +const account = await nearAccountFromKeyPair({ + accountId: NEAR_ACCOUNT_ID!, + keyPair: KeyPair.fromString(NEAR_ACCOUNT_PRIVATE_KEY!), + network: { + networkId: "testnet", + nodeUrl: "https://rpc.testnet.near.org", + }, + }); const adapter = await NearEthAdapter.fromConfig({ mpcContract: new MultichainContract( account, process.env.NEAR_MULTICHAIN_CONTRACT! ), - derivationPath: "ethereum,1", + // derivationPath: "ethereum,1", }); await adapter.signAndSendTransaction({ diff --git a/examples/setup.ts b/examples/setup.ts index cba0f84..f73b05e 100644 --- a/examples/setup.ts +++ b/examples/setup.ts @@ -1,18 +1,31 @@ import dotenv from "dotenv"; -import { MultichainContract, NearEthAdapter, nearAccountFromEnv } from "../src"; +import { + MultichainContract, + NearEthAdapter, + nearAccountFromKeyPair, +} from "../src"; +import { KeyPair } from "near-api-js"; // This is Sepolia, but can be replaced with nearly any EVM network. export const SEPOLIA_CHAIN_ID = 11_155_111; +const TESTNET_CONFIG = { + networkId: "testnet", + nodeUrl: "https://rpc.testnet.near.org", +}; export async function setupNearEthAdapter(): Promise { dotenv.config(); - const account = await nearAccountFromEnv(); + const account = await nearAccountFromKeyPair({ + keyPair: KeyPair.fromString(process.env.NEAR_ACCOUNT_PRIVATE_KEY!), + accountId: process.env.NEAR_ACCOUNT_ID!, + network: TESTNET_CONFIG, + }); return NearEthAdapter.fromConfig({ mpcContract: new MultichainContract( account, process.env.NEAR_MULTICHAIN_CONTRACT! ), - derivationPath: "ethereum,1", + // derivationPath: "ethereum,1", }); } diff --git a/src/chains/near.ts b/src/chains/near.ts index d254eca..0f130e8 100644 --- a/src/chains/near.ts +++ b/src/chains/near.ts @@ -8,28 +8,6 @@ export interface NearConfig { nodeUrl: string; } -const TESTNET_CONFIG = { - networkId: "testnet", - nodeUrl: "https://rpc.testnet.near.org", -}; - -/** - * Loads Near Account from process.env. - * Defaults to TESTNET_CONFIG if no network configuration is provided - * @param network {NearConfig} network settings - * @returns {Account} - */ -export const nearAccountFromEnv = async ( - network?: NearConfig -): Promise => { - const keyPair = KeyPair.fromString(process.env.NEAR_ACCOUNT_PRIVATE_KEY!); - return nearAccountFromKeyPair({ - keyPair, - accountId: process.env.NEAR_ACCOUNT_ID!, - network: network || TESTNET_CONFIG, - }); -}; - /** * Loads Near Account from provided keyPair and accountId * Defaults to TESTNET_CONFIG @@ -41,16 +19,9 @@ export const nearAccountFromEnv = async ( export const nearAccountFromKeyPair = async (config: { keyPair: KeyPair; accountId: string; - network?: NearConfig; + network: NearConfig; }): Promise => { - const keyStore = new keyStores.InMemoryKeyStore(); - await keyStore.setKey("testnet", config.accountId, config.keyPair); - const near = await connect({ - ...(config.network || TESTNET_CONFIG), - keyStore, - }); - const account = await near.account(config.accountId); - return account; + return createNearAccount(config.accountId, config.network, config.keyPair); }; /** Minimally sufficient Account instance to construct the signing contract instance. @@ -58,13 +29,21 @@ export const nearAccountFromKeyPair = async (config: { */ export const nearAccountFromAccountId = async ( accountId: string, - network?: NearConfig + network: NearConfig +): Promise => { + return createNearAccount(accountId, network); +}; + +const createNearAccount = async ( + accountId: string, + network: NearConfig, + keyPair?: KeyPair ): Promise => { const keyStore = new keyStores.InMemoryKeyStore(); - const near = await connect({ - ...(network || TESTNET_CONFIG), - keyStore, - }); + if (keyPair) { + await keyStore.setKey(network.networkId, accountId, keyPair); + } + const near = await connect({ ...network, keyStore }); const account = await near.account(accountId); return account; -}; +}; \ No newline at end of file diff --git a/src/mpcContract.ts b/src/mpcContract.ts index 9278b84..b03825b 100644 --- a/src/mpcContract.ts +++ b/src/mpcContract.ts @@ -5,13 +5,15 @@ import { najPublicKeyStrToUncompressedHexPoint, uncompressedHexPointToEvmAddress, } from "./utils/kdf"; -import { NO_DEPOSIT, nearAccountFromEnv, TGAS } from "./chains/near"; +import { NO_DEPOSIT, TGAS } from "./chains/near"; import { MPCSignature, NearContractFunctionPayload, SignArgs, } from "./types/types"; +const DEFAULT_MPC_CONTRACT = "v2.multichain-mpc.testnet"; + /// Near Contract Type for change methods export interface ChangeMethodArgs { /// Change method function agruments. @@ -38,8 +40,9 @@ export class MultichainContract { contract: MultichainContractInterface; connectedAccount: Account; - constructor(account: Account, contractId: string) { + constructor(account: Account, contractId: string = DEFAULT_MPC_CONTRACT) { this.connectedAccount = account; + this.contract = new Contract(account, contractId, { changeMethods: ["sign"], viewMethods: ["public_key"], @@ -47,14 +50,6 @@ export class MultichainContract { }) as MultichainContractInterface; } - static async fromEnv(): Promise { - const account = await nearAccountFromEnv(); - return new MultichainContract( - account, - process.env.NEAR_MULTICHAIN_CONTRACT! - ); - } - deriveEthAddress = async (derivationPath: string): Promise
=> { const rootPublicKey = await this.contract.public_key();