|
require("dotenv").config({ path: __dirname + "/.test.env" }) |
|
|
|
const { writeFile } = require("fs/promises"); |
|
const { Kmd, generateAccount, secretKeyToMnemonic, mnemonicToSecretKey } = require("algosdk"); |
|
const assert = require("assert"); |
|
|
|
const { |
|
ALGORAND_KMD_TOKEN, |
|
ALGORAND_KMD_API_BASE_URL, |
|
ALGORAND_KMD_API_PORT, |
|
TEST_ACCOUNTS_COUNT = 4, |
|
TEST_ACCOUNT_ENV_PREFIX = "TEST_ACCOUNT_ADDRESS_", |
|
} = process.env; |
|
|
|
const TEST_ACCOUNTS_TO_CREATE = Number(TEST_ACCOUNTS_COUNT); |
|
|
|
const kmdClient = new Kmd(ALGORAND_KMD_TOKEN, ALGORAND_KMD_API_BASE_URL, ALGORAND_KMD_API_PORT); |
|
|
|
const generateAccounts = (count) => Array.from({ length: count }).map(e => { |
|
const { addr, sk } = generateAccount(); |
|
const mnemonic = secretKeyToMnemonic(sk); |
|
|
|
return { address: addr, mnemonic }; |
|
}); |
|
|
|
const getTestAccounts = async () => { |
|
try { |
|
const testAccounts = require("./accounts.json"); |
|
return testAccounts; |
|
} catch { |
|
console.log(`accounts.json not found, generating ${TEST_ACCOUNTS_TO_CREATE} test accounts`); |
|
} |
|
|
|
const accounts = generateAccounts(TEST_ACCOUNTS_TO_CREATE); |
|
await writeFile(__dirname + "/accounts.json", JSON.stringify(accounts, null, 2)); |
|
|
|
return accounts; |
|
} |
|
|
|
const getTestAddresses = async (testAccounts, walletHandleToken) => { |
|
const { addresses } = await kmdClient.listKeys(walletHandleToken); |
|
|
|
const testAddresses = addresses.filter(address => testAccounts.some(testAccount => testAccount.address === address)); |
|
|
|
if (testAddresses.length !== testAccounts.length) { |
|
console.log("importing test accounts"); |
|
|
|
await Promise.all( |
|
testAccounts.map( |
|
account => { |
|
const { sk } = mnemonicToSecretKey(account.mnemonic); |
|
return kmdClient.importKey(walletHandleToken, sk); |
|
} |
|
) |
|
); |
|
|
|
return getTestAddresses(testAccounts, walletHandleToken); |
|
} |
|
|
|
console.log("test accounts imported"); |
|
|
|
return testAddresses; |
|
} |
|
|
|
const getKmdDefaultWalletHandle = async () => { |
|
const [defaultWallet] = (await kmdClient.listWallets()).wallets; |
|
|
|
const { wallet_handle_token: walletHandleToken } = await kmdClient.initWalletHandle(defaultWallet.id, "") |
|
|
|
return walletHandleToken; |
|
} |
|
|
|
const loadTestAddressesIntoEnv = (testAddresses) => testAddresses.forEach((address, index) => { |
|
const envVar = `${TEST_ACCOUNT_ENV_PREFIX}${index}`; |
|
process.env[envVar] = address; |
|
}); |
|
|
|
const assertTestAddressEnv = (testAddresses) => testAddresses.forEach((_, index) => { |
|
const envVar = `${TEST_ACCOUNT_ENV_PREFIX}${index}`; |
|
assert.notEqual(process.env[envVar], undefined, `Test account address env var [${envVar}] not set`); |
|
}); |
|
|
|
|
|
const setupTestAccounts = async () => { |
|
const testAccounts = await getTestAccounts(); |
|
const defaultWalletHandleToken = await getKmdDefaultWalletHandle(); |
|
const testAddresses = await getTestAddresses(testAccounts, defaultWalletHandleToken); |
|
|
|
loadTestAddressesIntoEnv(testAddresses); |
|
assertTestAddressEnv(testAddresses); |
|
console.log("all test account addresses imported into env!"); |
|
}; |
|
|
|
module.exports = setupTestAccounts; |