solana/web3.js/test/secp256k1-program.test.js

83 lines
2.3 KiB
JavaScript

// @flow
import {Buffer} from 'buffer';
import {keccak_256} from 'js-sha3';
import {privateKeyVerify, ecdsaSign, publicKeyCreate} from 'secp256k1';
import {
Connection,
Account,
sendAndConfirmTransaction,
LAMPORTS_PER_SOL,
Transaction,
Secp256k1Program,
} from '../src';
import {url} from './url';
import {toBuffer} from '../src/util/to-buffer';
const randomPrivateKey = () => {
let privateKey;
do {
privateKey = new Account().secretKey.slice(0, 32);
} while (!privateKeyVerify(privateKey));
return privateKey;
};
if (process.env.TEST_LIVE) {
describe('secp256k1', () => {
it('create secp256k1 instruction with public key', async () => {
const privateKey = randomPrivateKey();
const publicKey = publicKeyCreate(privateKey, false);
const message = Buffer.from('This is a message');
const messageHash = Buffer.from(
keccak_256.update(toBuffer(message)).digest(),
);
const {signature, recid: recoveryId} = ecdsaSign(messageHash, privateKey);
const connection = new Connection(url, 'confirmed');
const from = new Account();
await connection.confirmTransaction(
await connection.requestAirdrop(from.publicKey, 2 * LAMPORTS_PER_SOL),
'confirmed',
);
const transaction = new Transaction().add(
Secp256k1Program.createInstructionWithPublicKey({
publicKey,
message,
signature,
recoveryId,
}),
);
await sendAndConfirmTransaction(connection, transaction, [from], {
commitment: 'confirmed',
preflightCommitment: 'confirmed',
});
});
it('create secp256k1 instruction with private key', async () => {
const privateKey = randomPrivateKey();
const connection = new Connection(url, 'confirmed');
const from = new Account();
await connection.confirmTransaction(
await connection.requestAirdrop(from.publicKey, 2 * LAMPORTS_PER_SOL),
'confirmed',
);
const transaction = new Transaction().add(
Secp256k1Program.createInstructionWithPrivateKey({
privateKey,
message: Buffer.from('Test 123'),
}),
);
await sendAndConfirmTransaction(connection, transaction, [from], {
commitment: 'confirmed',
preflightCommitment: 'confirmed',
});
});
});
}