From 9ed535feb0b962ed86403b83ca9745d6274d3edd Mon Sep 17 00:00:00 2001 From: ruijialin Date: Wed, 23 Oct 2024 16:47:45 -0400 Subject: [PATCH] chore: update examples --- .env.example | 5 +++- examples/c-chain/export.ts | 14 ++++------ examples/c-chain/import.ts | 10 +++---- examples/generate-keys.ts | 22 +++++++++++++-- examples/p-chain/base.ts | 8 +++--- examples/p-chain/delegate.ts | 8 +++--- examples/p-chain/etna/convertSubnet.ts | 38 ++++++++++++++++++-------- examples/p-chain/etna/createChain.ts | 20 +++++++++++--- examples/p-chain/etna/createSubnet.ts | 4 +-- examples/p-chain/etna/validate.ts | 16 ++++++----- examples/p-chain/export.ts | 10 +++---- examples/p-chain/import.ts | 10 +++---- examples/p-chain/validate.ts | 25 +++++++++-------- examples/utils/getEnvVars.ts | 24 +++++++++++++++- examples/x-chain/export.ts | 10 +++---- examples/x-chain/import.ts | 10 +++---- package.json | 1 + 17 files changed, 154 insertions(+), 81 deletions(-) diff --git a/.env.example b/.env.example index a69cdd9ec..57d31759f 100644 --- a/.env.example +++ b/.env.example @@ -4,4 +4,7 @@ PRIVATE_KEY=... C_CHAIN_ADDRESS=0x... X_CHAIN_ADDRESS=X-fuji... P_CHAIN_ADDRESS=P-fuji... -CORETH_ADDRESS=C-fuji... \ No newline at end of file +CORETH_ADDRESS=C-fuji... +NODE_ID=NodeID-... +BLS_PUBLIC_KEY=0x... +BLS_SIGNATURE=0x... \ No newline at end of file diff --git a/examples/c-chain/export.ts b/examples/c-chain/export.ts index 1df339c15..9791591a1 100644 --- a/examples/c-chain/export.ts +++ b/examples/c-chain/export.ts @@ -4,21 +4,19 @@ import { bech32ToBytes, hexToBuffer } from '../../src/utils'; import { getContextFromURI } from '../../src/vms/context'; import { newExportTxFromBaseFee } from '../../src/vms/evm'; import { evmapi } from '../chain_apis'; - -const C_CHAIN_ADDRESS = process.env.C_CHAIN_ADDRESS; -const X_CHAIN_ADDRESS = process.env.X_CHAIN_ADDRESS; -const PRIVATE_KEY = process.env.PRIVATE_KEY; +import { getEnvVars } from '../utils/getEnvVars'; const main = async () => { + const { AVAX_PUBLIC_URL, C_CHAIN_ADDRESS, PRIVATE_KEY, X_CHAIN_ADDRESS } = + getEnvVars(); + if (!C_CHAIN_ADDRESS || !X_CHAIN_ADDRESS || !PRIVATE_KEY) { throw new Error('Missing environment variable(s).'); } - const provider = new JsonRpcProvider( - process.env.AVAX_PUBLIC_URL + '/ext/bc/C/rpc', - ); + const provider = new JsonRpcProvider(AVAX_PUBLIC_URL + '/ext/bc/C/rpc'); - const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + const context = await getContextFromURI(AVAX_PUBLIC_URL); const txCount = await provider.getTransactionCount(C_CHAIN_ADDRESS); const baseFee = await evmapi.getBaseFee(); const xAddressBytes = bech32ToBytes(X_CHAIN_ADDRESS); diff --git a/examples/c-chain/import.ts b/examples/c-chain/import.ts index 4df8a1165..458051440 100644 --- a/examples/c-chain/import.ts +++ b/examples/c-chain/import.ts @@ -4,18 +4,18 @@ import { getContextFromURI } from '../../src/vms/context'; import { newImportTxFromBaseFee } from '../../src/vms/evm'; import { evmapi } from '../chain_apis'; import { getChainIdFromContext } from '../utils/getChainIdFromContext'; - -const C_CHAIN_ADDRESS = process.env.C_CHAIN_ADDRESS; -const CORETH_ADDRESS = process.env.CORETH_ADDRESS; -const PRIVATE_KEY = process.env.PRIVATE_KEY; +import { getEnvVars } from '../utils/getEnvVars'; const main = async (sourceChain: 'X' | 'P') => { + const { AVAX_PUBLIC_URL, C_CHAIN_ADDRESS, PRIVATE_KEY, CORETH_ADDRESS } = + getEnvVars(); + if (!C_CHAIN_ADDRESS || !CORETH_ADDRESS || !PRIVATE_KEY) { throw new Error('Missing environment variable(s).'); } const baseFee = await evmapi.getBaseFee(); - const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + const context = await getContextFromURI(AVAX_PUBLIC_URL); const { utxos } = await evmapi.getUTXOs({ sourceChain, diff --git a/examples/generate-keys.ts b/examples/generate-keys.ts index 39130bb6a..b44eeb5ab 100644 --- a/examples/generate-keys.ts +++ b/examples/generate-keys.ts @@ -1,20 +1,31 @@ -import { secp256k1, utils } from '../src'; +import { info, secp256k1, utils } from '../src'; import { Address } from 'micro-eth-signer'; +import { getEnvVars } from './utils/getEnvVars'; + +type NodeIdResponse = { + nodeID: string; + nodePOP: { publicKey: string; proofOfPossession: string }; +}; /** * Generate a new private/public key pair and console log out the needed environment variables * needed to run the examples. Please these values in a `.env` file. */ const main = async () => { + const { AVAX_PUBLIC_URL } = getEnvVars(); + const privateKey = secp256k1.randomPrivateKey(); const publicKey = secp256k1.getPublicKey(privateKey); - const hrp = 'custom'; const address = utils.formatBech32( hrp, secp256k1.publicKeyBytesToAddress(publicKey), ); + const infoApi = new info.InfoApi(AVAX_PUBLIC_URL); + + const nodeIdResponse = (await infoApi.getNodeId()) as NodeIdResponse; + console.log('Copy the below values to your `.env` file:'); console.log('------------------------------------------\n'); @@ -26,6 +37,13 @@ const main = async () => { console.log('X_CHAIN_ADDRESS=', `"X-${address}"`); console.log('C_CHAIN_ADDRESS=', `"${Address.fromPublicKey(publicKey)}"`); console.log('CORETH_ADDRESS=', `"C-${address}"`); + + console.log('NodeId=', `"${nodeIdResponse.nodeID}"`); + console.log('BLS_PUBLIC_KEY=', `"${nodeIdResponse.nodePOP.publicKey}"`); + console.log( + 'PROOF_OF_POSSESSION=', + `"${nodeIdResponse.nodePOP.proofOfPossession}"`, + ); }; main(); diff --git a/examples/p-chain/base.ts b/examples/p-chain/base.ts index 5455c41ab..d13f8af1d 100644 --- a/examples/p-chain/base.ts +++ b/examples/p-chain/base.ts @@ -4,17 +4,17 @@ import { bech32ToBytes, hexToBuffer } from '../../src/utils'; import { getContextFromURI } from '../../src/vms/context'; import { newBaseTx } from '../../src/vms/pvm'; import { pvmapi } from '../chain_apis'; - -const P_CHAIN_ADDRESS = process.env.P_CHAIN_ADDRESS; -const PRIVATE_KEY = process.env.PRIVATE_KEY; +import { getEnvVars } from '../utils/getEnvVars'; const main = async () => { + const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY } = getEnvVars(); + if (!P_CHAIN_ADDRESS || !PRIVATE_KEY) { throw new Error('Missing environment variable(s).'); } const { utxos } = await pvmapi.getUTXOs({ addresses: [P_CHAIN_ADDRESS] }); - const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + const context = await getContextFromURI(AVAX_PUBLIC_URL); const tx = newBaseTx(context, [bech32ToBytes(P_CHAIN_ADDRESS)], utxos, [ TransferableOutput.fromNative(context.avaxAssetID, BigInt(0.1 * 1e9), [ diff --git a/examples/p-chain/delegate.ts b/examples/p-chain/delegate.ts index c490aa453..e48ca14e6 100644 --- a/examples/p-chain/delegate.ts +++ b/examples/p-chain/delegate.ts @@ -4,17 +4,17 @@ import { bech32ToBytes, hexToBuffer } from '../../src/utils'; import { getContextFromURI } from '../../src/vms/context'; import { PVMApi, newAddPermissionlessDelegatorTx } from '../../src/vms/pvm'; import { pvmapi } from '../chain_apis'; - -const P_CHAIN_ADDRESS = process.env.P_CHAIN_ADDRESS; -const PRIVATE_KEY = process.env.PRIVATE_KEY; +import { getEnvVars } from '../utils/getEnvVars'; const main = async () => { + const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY } = getEnvVars(); + if (!P_CHAIN_ADDRESS || !PRIVATE_KEY) { throw new Error('Missing environment variable(s).'); } const { utxos } = await pvmapi.getUTXOs({ addresses: [P_CHAIN_ADDRESS] }); - const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + const context = await getContextFromURI(AVAX_PUBLIC_URL); const startTime = await new PVMApi().getTimestamp(); const startDate = new Date(startTime.timestamp); const start = BigInt(startDate.getTime() / 1000); diff --git a/examples/p-chain/etna/convertSubnet.ts b/examples/p-chain/etna/convertSubnet.ts index 5af9cb3e3..13d526d1f 100644 --- a/examples/p-chain/etna/convertSubnet.ts +++ b/examples/p-chain/etna/convertSubnet.ts @@ -8,8 +8,27 @@ import { getEnvVars } from '../../utils/getEnvVars'; const AMOUNT_TO_VALIDATE_AVAX: number = 1; const BALANCE_AVAX: number = 1; -const main = async () => { - const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY } = getEnvVars(); +/** + * Converts a subnet to permissionless subnet. + * + * **Note** A subnet must be created (createSubnetTx) and a chain must be created (createChainTx) + * before a subnet can be converted from permissioned to permissionless. + * @param BLS_PUBLIC_KEY BLS key from info.getNodeID on AVAX_PUBLIC_URL + * @param BLS_SIGNATURE BLS signature from info.getNodeID on AVAX_PUBLIC_URL + * @param NODE_ID the ID of the node from info.getNodeID on AVAX_PUBLIC_URL. + * @param chainId the ID of the chain that is created via `createChainTx`. + * @param subnetId the ID of the subnet that is created via `createSubnetTx`. + * @returns The resulting transaction's ID. + */ +const convertSubnetTxExmaple = async () => { + const { + AVAX_PUBLIC_URL, + P_CHAIN_ADDRESS, + PRIVATE_KEY, + NODE_ID, + BLS_PUBLIC_KEY, + BLS_SIGNATURE, + } = getEnvVars(); const { context, feeState, pvmApi } = await setupEtnaExample(AVAX_PUBLIC_URL); const { utxos } = await pvmApi.getUTXOs({ addresses: [P_CHAIN_ADDRESS] }); @@ -17,20 +36,15 @@ const main = async () => { const testPAddr = utils.bech32ToBytes(P_CHAIN_ADDRESS); const pChainOwner = PChainOwner.fromNative([testPAddr], 1); - const nodeId = 'NodeID-7eRvnfs2a2PvrPHUuCRRpPVAoVjbWxaFG'; - const publicKey = utils.hexToBuffer( - '0x8f95423f7142d00a48e1014a3de8d28907d420dc33b3052a6dee03a3f2941a393c2351e354704ca66a3fc29870282e15', - ); + const publicKey = utils.hexToBuffer(BLS_PUBLIC_KEY); - const signature = utils.hexToBuffer( - '0x86a3ab4c45cfe31cae34c1d06f212434ac71b1be6cfe046c80c162e057614a94a5bc9f1ded1a7029deb0ba4ca7c9b71411e293438691be79c2dbf19d1ca7c3eadb9c756246fc5de5b7b89511c7d7302ae051d9e03d7991138299b5ed6a570a98', - ); + const signature = utils.hexToBuffer(BLS_SIGNATURE); const signer = new ProofOfPossession(publicKey, signature); const validator = ConvertSubnetValidator.fromNative( - nodeId, + NODE_ID, BigInt(AMOUNT_TO_VALIDATE_AVAX * 1e9), BigInt(BALANCE_AVAX * 1e9), signer, @@ -44,7 +58,7 @@ const main = async () => { fromAddressesBytes: [testPAddr], subnetId: '', // subnetId from createSubnetTx utxos, - chainId: 'h5vH4Zz53MTN2jf72axZCfo1VbG1cMR6giR4Ra2TTpEmqxDWB', + chainId: '', // chainId from createChainTx validators: [validator], subnetAuth: [0], address: testPAddr, @@ -60,4 +74,4 @@ const main = async () => { return pvmApi.issueSignedTx(tx.getSignedTx()); }; -main().then(console.log); +convertSubnetTxExmaple().then(console.log); diff --git a/examples/p-chain/etna/createChain.ts b/examples/p-chain/etna/createChain.ts index 5f8bbb386..86520e589 100644 --- a/examples/p-chain/etna/createChain.ts +++ b/examples/p-chain/etna/createChain.ts @@ -3,7 +3,16 @@ import { setupEtnaExample } from './utils/etna-helper'; import { testGenesisData } from '../../../src/fixtures/transactions'; import { getEnvVars } from '../../utils/getEnvVars'; -const main = async () => { +/** + * Create a new chain on the P-Chain. + * + * **Note** A subnet must be created (createSubnetTx) before a chain can be created. + * @param vmId the platform chain's vmID can be found in the `InfoApi.getVMs` response. + * @param subnetId the ID of the subnet that is created via `createSubnetTx`. + * @param chainName the name of the chain. Can be any string. + * @returns The resulting transaction's ID. + */ +const createChainTxExample = async () => { const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY } = getEnvVars(); const { context, feeState, pvmApi } = await setupEtnaExample(AVAX_PUBLIC_URL); @@ -11,6 +20,9 @@ const main = async () => { const testPAddr = utils.bech32ToBytes(P_CHAIN_ADDRESS); + const vmId = 'rWhpuQPF1kb72esV2momhMuTYGkEb1oL29pt2EBXWmSy4kxnT'; // platform vmId + const subnetId = ''; // subnetId from createSubnetTx + const tx = pvm.e.newCreateChainTx( { feeState, @@ -18,8 +30,8 @@ const main = async () => { utxos, chainName: 'test chain', subnetAuth: [0], - subnetId: '', // subnetId from createSubnetTx - vmId: 'rWhpuQPF1kb72esV2momhMuTYGkEb1oL29pt2EBXWmSy4kxnT', // platform vmId + subnetId, + vmId, fxIds: [], genesisData: testGenesisData, }, @@ -34,4 +46,4 @@ const main = async () => { return pvmApi.issueSignedTx(tx.getSignedTx()); }; -main().then(console.log); +createChainTxExample().then(console.log); diff --git a/examples/p-chain/etna/createSubnet.ts b/examples/p-chain/etna/createSubnet.ts index 76ff4a44a..c1fe5b9a5 100644 --- a/examples/p-chain/etna/createSubnet.ts +++ b/examples/p-chain/etna/createSubnet.ts @@ -2,7 +2,7 @@ import { addTxSignatures, pvm, utils } from '../../../src'; import { getEnvVars } from '../../utils/getEnvVars'; import { setupEtnaExample } from './utils/etna-helper'; -const main = async () => { +const createSubnetTxExample = async () => { const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY } = getEnvVars(); const { context, feeState, pvmApi } = await setupEtnaExample(AVAX_PUBLIC_URL); @@ -29,4 +29,4 @@ const main = async () => { return pvmApi.issueSignedTx(tx.getSignedTx()); }; -main().then(console.log); +createSubnetTxExample().then(console.log); diff --git a/examples/p-chain/etna/validate.ts b/examples/p-chain/etna/validate.ts index f74f65bfb..041e0e6b7 100644 --- a/examples/p-chain/etna/validate.ts +++ b/examples/p-chain/etna/validate.ts @@ -9,7 +9,13 @@ const DAYS_TO_VALIDATE: number = 21; const nodeId = getRandomNodeId(); const main = async () => { - const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY } = getEnvVars(); + const { + AVAX_PUBLIC_URL, + P_CHAIN_ADDRESS, + PRIVATE_KEY, + BLS_PUBLIC_KEY, + BLS_SIGNATURE, + } = getEnvVars(); const { context, feeState, pvmApi } = await setupEtnaExample(AVAX_PUBLIC_URL); @@ -23,13 +29,9 @@ const main = async () => { endTime.setDate(endTime.getDate() + DAYS_TO_VALIDATE); const end: bigint = BigInt(endTime.getTime() / 1_000); - const publicKey = utils.hexToBuffer( - '0x8f95423f7142d00a48e1014a3de8d28907d420dc33b3052a6dee03a3f2941a393c2351e354704ca66a3fc29870282e15', - ); + const publicKey = utils.hexToBuffer(BLS_PUBLIC_KEY); - const signature = utils.hexToBuffer( - '0x86a3ab4c45cfe31cae34c1d06f212434ac71b1be6cfe046c80c162e057614a94a5bc9f1ded1a7029deb0ba4ca7c9b71411e293438691be79c2dbf19d1ca7c3eadb9c756246fc5de5b7b89511c7d7302ae051d9e03d7991138299b5ed6a570a98', - ); + const signature = utils.hexToBuffer(BLS_SIGNATURE); const tx = pvm.e.newAddPermissionlessValidatorTx( { diff --git a/examples/p-chain/export.ts b/examples/p-chain/export.ts index 5f1f13c60..fcdaa65e1 100644 --- a/examples/p-chain/export.ts +++ b/examples/p-chain/export.ts @@ -5,17 +5,17 @@ import { getContextFromURI } from '../../src/vms/context'; import { newExportTx } from '../../src/vms/pvm'; import { pvmapi } from '../chain_apis'; import { getChainIdFromContext } from '../utils/getChainIdFromContext'; - -const P_CHAIN_ADDRESS = process.env.P_CHAIN_ADDRESS; -const X_CHAIN_ADDRESS = process.env.X_CHAIN_ADDRESS; -const PRIVATE_KEY = process.env.PRIVATE_KEY; +import { getEnvVars } from '../utils/getEnvVars'; const main = async () => { + const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY, X_CHAIN_ADDRESS } = + getEnvVars(); + if (!P_CHAIN_ADDRESS || !X_CHAIN_ADDRESS || !PRIVATE_KEY) { throw new Error('Missing environment variable(s).'); } - const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + const context = await getContextFromURI(AVAX_PUBLIC_URL); const { utxos } = await pvmapi.getUTXOs({ addresses: [P_CHAIN_ADDRESS], diff --git a/examples/p-chain/import.ts b/examples/p-chain/import.ts index 890ac2cb5..112a4b4f1 100644 --- a/examples/p-chain/import.ts +++ b/examples/p-chain/import.ts @@ -4,17 +4,17 @@ import { getContextFromURI } from '../../src/vms/context'; import { newImportTx } from '../../src/vms/pvm'; import { pvmapi } from '../chain_apis'; import { getChainIdFromContext } from '../utils/getChainIdFromContext'; - -const P_CHAIN_ADDRESS = process.env.P_CHAIN_ADDRESS; -const X_CHAIN_ADDRESS = process.env.X_CHAIN_ADDRESS; -const PRIVATE_KEY = process.env.PRIVATE_KEY; +import { getEnvVars } from '../utils/getEnvVars'; const main = async () => { + const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY, X_CHAIN_ADDRESS } = + getEnvVars(); + if (!P_CHAIN_ADDRESS || !X_CHAIN_ADDRESS || !PRIVATE_KEY) { throw new Error('Missing environment variable(s).'); } - const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + const context = await getContextFromURI(AVAX_PUBLIC_URL); const { utxos } = await pvmapi.getUTXOs({ sourceChain: 'X', diff --git a/examples/p-chain/validate.ts b/examples/p-chain/validate.ts index 41c3aebf2..8630a52d0 100644 --- a/examples/p-chain/validate.ts +++ b/examples/p-chain/validate.ts @@ -4,30 +4,33 @@ import { bech32ToBytes, hexToBuffer } from '../../src/utils'; import { getContextFromURI } from '../../src/vms/context'; import { PVMApi, newAddPermissionlessValidatorTx } from '../../src/vms/pvm'; import { pvmapi } from '../chain_apis'; - -const P_CHAIN_ADDRESS = process.env.P_CHAIN_ADDRESS; -const PRIVATE_KEY = process.env.PRIVATE_KEY; +import { getEnvVars } from '../utils/getEnvVars'; const main = async () => { + const { + AVAX_PUBLIC_URL, + P_CHAIN_ADDRESS, + PRIVATE_KEY, + BLS_PUBLIC_KEY, + BLS_SIGNATURE, + NODE_ID, + } = getEnvVars(); + if (!P_CHAIN_ADDRESS || !PRIVATE_KEY) { throw new Error('Missing environment variable(s).'); } const { utxos } = await pvmapi.getUTXOs({ addresses: [P_CHAIN_ADDRESS] }); - const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + const context = await getContextFromURI(AVAX_PUBLIC_URL); const startTime = await new PVMApi().getTimestamp(); const startDate = new Date(startTime.timestamp); const start = BigInt(startDate.getTime() / 1000); const endTime = new Date(startTime.timestamp); endTime.setDate(endTime.getDate() + 21); const end = BigInt(endTime.getTime() / 1000); - const nodeID = 'NodeID-HKLp5269LH8DcrLvNDoJquQs2w1LwLCga'; - const blsPublicKey = hexToBuffer( - '0x8f95423f7142d00a48e1014a3de8d28907d420dc33b3052a6dee03a3f2941a393c2351e354704ca66a3fc29870282e15', - ); - const blsSignature = hexToBuffer( - '0x86a3ab4c45cfe31cae34c1d06f212434ac71b1be6cfe046c80c162e057614a94a5bc9f1ded1a7029deb0ba4ca7c9b71411e293438691be79c2dbf19d1ca7c3eadb9c756246fc5de5b7b89511c7d7302ae051d9e03d7991138299b5ed6a570a98', - ); + const nodeID = NODE_ID; + const blsPublicKey = hexToBuffer(BLS_PUBLIC_KEY); + const blsSignature = hexToBuffer(BLS_SIGNATURE); const tx = newAddPermissionlessValidatorTx( context, diff --git a/examples/utils/getEnvVars.ts b/examples/utils/getEnvVars.ts index a92f92930..9673ede90 100644 --- a/examples/utils/getEnvVars.ts +++ b/examples/utils/getEnvVars.ts @@ -2,9 +2,26 @@ const AVAX_PUBLIC_URL = process.env['AVAX_PUBLIC_URL']; const P_CHAIN_ADDRESS = process.env['P_CHAIN_ADDRESS']; const PRIVATE_KEY = process.env['PRIVATE_KEY']; const X_CHAIN_ADDRESS = process.env['X_CHAIN_ADDRESS']; +const C_CHAIN_ADDRESS = process.env['C_CHAIN_ADDRESS']; +const NODE_ID = process.env['NODE_ID']; +const BLS_PUBLIC_KEY = process.env['BLS_PUBLIC_KEY']; +const BLS_SIGNATURE = process.env['BLS_SIGNATURE']; +const CORETH_ADDRESS = process.env['CORETH_ADDRESS']; export const getEnvVars = () => { - if (!(AVAX_PUBLIC_URL && P_CHAIN_ADDRESS && PRIVATE_KEY && X_CHAIN_ADDRESS)) { + if ( + !( + AVAX_PUBLIC_URL && + P_CHAIN_ADDRESS && + PRIVATE_KEY && + X_CHAIN_ADDRESS && + NODE_ID && + BLS_PUBLIC_KEY && + BLS_SIGNATURE && + C_CHAIN_ADDRESS && + CORETH_ADDRESS + ) + ) { throw new Error('Missing environment variable(s).'); } @@ -13,5 +30,10 @@ export const getEnvVars = () => { P_CHAIN_ADDRESS, PRIVATE_KEY, X_CHAIN_ADDRESS, + NODE_ID, + BLS_PUBLIC_KEY, + BLS_SIGNATURE, + C_CHAIN_ADDRESS, + CORETH_ADDRESS, }; }; diff --git a/examples/x-chain/export.ts b/examples/x-chain/export.ts index 38864b1f5..eedbab243 100644 --- a/examples/x-chain/export.ts +++ b/examples/x-chain/export.ts @@ -5,17 +5,17 @@ import { newExportTx } from '../../src/vms/avm'; import { getContextFromURI } from '../../src/vms/context'; import { avmapi } from '../chain_apis'; import { getChainIdFromContext } from '../utils/getChainIdFromContext'; - -const P_CHAIN_ADDRESS = process.env.P_CHAIN_ADDRESS; -const X_CHAIN_ADDRESS = process.env.X_CHAIN_ADDRESS; -const PRIVATE_KEY = process.env.PRIVATE_KEY; +import { getEnvVars } from '../utils/getEnvVars'; const main = async () => { + const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY, X_CHAIN_ADDRESS } = + getEnvVars(); + if (!P_CHAIN_ADDRESS || !X_CHAIN_ADDRESS || !PRIVATE_KEY) { throw new Error('Missing environment variable(s).'); } - const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + const context = await getContextFromURI(AVAX_PUBLIC_URL); const { utxos } = await avmapi.getUTXOs({ addresses: [X_CHAIN_ADDRESS], diff --git a/examples/x-chain/import.ts b/examples/x-chain/import.ts index 88f5c8bc3..bcd18be06 100644 --- a/examples/x-chain/import.ts +++ b/examples/x-chain/import.ts @@ -4,17 +4,17 @@ import { newImportTx } from '../../src/vms/avm'; import { getContextFromURI } from '../../src/vms/context'; import { avmapi } from '../chain_apis'; import { getChainIdFromContext } from '../utils/getChainIdFromContext'; - -const P_CHAIN_ADDRESS = process.env.P_CHAIN_ADDRESS; -const X_CHAIN_ADDRESS = process.env.X_CHAIN_ADDRESS; -const PRIVATE_KEY = process.env.PRIVATE_KEY; +import { getEnvVars } from '../utils/getEnvVars'; export const main = async () => { + const { AVAX_PUBLIC_URL, P_CHAIN_ADDRESS, PRIVATE_KEY, X_CHAIN_ADDRESS } = + getEnvVars(); + if (!P_CHAIN_ADDRESS || !X_CHAIN_ADDRESS || !PRIVATE_KEY) { throw new Error('Missing environment variable(s).'); } - const context = await getContextFromURI(process.env.AVAX_PUBLIC_URL); + const context = await getContextFromURI(AVAX_PUBLIC_URL); const { utxos } = await avmapi.getUTXOs({ sourceChain: 'P', diff --git a/package.json b/package.json index a5ae14a4a..6f92e3997 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "lint:check": "eslint --ignore-path .gitignore \"./**/*.ts*\"", "typecheck": "tsc --skipLibCheck --noEmit", "example": "NODE_OPTIONS='--loader ts-node/esm' ts-node examples/c-chain/export.ts", + "example:generateKeys": "NODE_OPTIONS='--loader ts-node/esm' ts-node examples/generate-keys.ts", "prepare": "husky install" }, "dependencies": {