Files
.buildkite
.github
.travis
account-decoder
accounts-bench
banking-bench
banks-client
banks-interface
banks-server
bench-exchange
bench-streamer
bench-tps
ci
clap-utils
cli
cli-config
cli-output
client
core
crate-features
docs
dos
download-utils
explorer
faucet
frozen-abi
genesis
gossip
install
keygen
ledger
ledger-tool
local-cluster
log-analyzer
logger
measure
merkle-root-bench
merkle-tree
metrics
multinode-demo
net
net-shaper
net-utils
notifier
perf
poh-bench
program-test
programs
ramp-tps
rayon-threadlimit
remote-wallet
runtime
scripts
sdk
stake-accounts
stake-monitor
stake-o-matic
storage-bigtable
storage-proto
streamer
sys-tuner
system-test
tokens
transaction-status
upload-perf
validator
version
watchtower
web3.js
.github
.travis
bin
css
examples
flow-typed
src
test
fixtures
mocks
rpc-http.js
rpc-websockets.js
.gitignore
account.test.js
agent-manager.test.js
bpf-loader.test.js
cluster.test.js
connection.test.js
nonce.test.js
publickey.test.js
rollup.config.js
secp256k1-program.test.js
shortvec-encoding.test.js
stake-program.test.js
system-program.test.js
transaction-payer.test.js
transaction.test.js
url.js
validator-info.test.js
websocket.test.js
.esdoc.json
.eslintignore
.eslintrc.js
.flowconfig
.gitignore
.mergify.yml
.mocharc.js
.prettierignore
.prettierrc.yaml
.sgcrc
.travis.yml
CONTRIBUTING.md
LICENSE
README.md
babel.config.json
commitlint.config.js
mocha.html
module.d.ts
module.flow.js
package-lock.json
package.json
rollup.config.js
.clippy.toml
.codecov.yml
.gitignore
.mergify.yml
.travis.yml
CONTRIBUTING.md
Cargo.lock
Cargo.toml
LICENSE
README.md
RELEASE.md
cargo
cargo-build-bpf
cargo-test-bpf
fetch-perf-libs.sh
fetch-spl.sh
run.sh
test-abi.sh
solana/web3.js/test/mocks/rpc-http.js

178 lines
3.5 KiB
JavaScript
Raw Normal View History

2021-02-06 10:59:00 +08:00
// @flow
import bs58 from 'bs58';
import BN from 'bn.js';
import * as mockttp from 'mockttp';
2021-02-08 00:57:12 +08:00
import {mockRpcMessage} from './rpc-websockets';
import {Account, Connection, PublicKey, Transaction} from '../../src';
2021-02-06 10:59:00 +08:00
import type {Commitment} from '../../src/connection';
2021-02-08 00:57:12 +08:00
export const mockServer: mockttp.Mockttp =
process.env.TEST_LIVE || mockttp.getLocal();
2021-02-06 10:59:00 +08:00
let uniqueCounter = 0;
export const uniqueSignature = () => {
return bs58.encode(new BN(++uniqueCounter).toArray(null, 64));
};
export const uniqueBlockhash = () => {
return bs58.encode(new BN(++uniqueCounter).toArray(null, 32));
};
export const mockErrorMessage = 'Invalid';
export const mockErrorResponse = {
code: -32602,
message: mockErrorMessage,
};
export const mockRpcResponse = async ({
method,
params,
value,
error,
withContext,
}: {
method: string,
params: Array<any>,
2021-02-08 00:57:12 +08:00
value?: any,
error?: any,
2021-02-06 10:59:00 +08:00
withContext?: boolean,
}) => {
if (process.env.TEST_LIVE) return;
2021-02-08 00:57:12 +08:00
let result = value;
if (withContext) {
result = {
context: {
slot: 11,
},
value,
};
}
2021-02-06 10:59:00 +08:00
await mockServer
.post('/')
.withJsonBodyIncluding({
jsonrpc: '2.0',
method,
params,
})
.thenReply(
200,
JSON.stringify({
jsonrpc: '2.0',
id: '',
error,
result,
}),
);
};
const recentBlockhash = async ({
connection,
commitment,
}: {
connection: Connection,
2021-02-08 00:57:12 +08:00
commitment?: Commitment,
2021-02-06 10:59:00 +08:00
}) => {
const blockhash = uniqueBlockhash();
const params = [];
if (commitment) {
params.push({commitment});
}
await mockRpcResponse({
method: 'getRecentBlockhash',
params,
value: {
blockhash,
feeCalculator: {
lamportsPerSignature: 42,
},
},
withContext: true,
});
return await connection.getRecentBlockhash(commitment);
};
const processTransaction = async ({
connection,
transaction,
signers,
commitment,
err,
}: {
connection: Connection,
transaction: Transaction,
signers: Array<Account>,
commitment: Commitment,
err?: any,
}) => {
const blockhash = (await recentBlockhash({connection})).blockhash;
transaction.recentBlockhash = blockhash;
transaction.sign(...signers);
const encoded = transaction.serialize().toString('base64');
const signature = bs58.encode(transaction.signature);
await mockRpcResponse({
method: 'sendTransaction',
params: [encoded],
value: signature,
});
2021-02-08 00:57:12 +08:00
let sendOptions;
if (err) {
sendOptions = {
skipPreflight: true,
};
} else {
sendOptions = {
preflightCommitment: commitment,
};
}
2021-02-06 10:59:00 +08:00
await connection.sendEncodedTransaction(encoded, sendOptions);
await mockRpcMessage({
method: 'signatureSubscribe',
params: [signature, {commitment}],
result: {err: err || null},
});
return await connection.confirmTransaction(signature, commitment);
};
const airdrop = async ({
connection,
address,
amount,
}: {
connection: Connection,
address: PublicKey,
amount: number,
}) => {
await mockRpcResponse({
method: 'requestAirdrop',
params: [address.toBase58(), amount],
value: uniqueSignature(),
});
const signature = await connection.requestAirdrop(address, amount);
await mockRpcMessage({
method: 'signatureSubscribe',
params: [signature, {commitment: 'confirmed'}],
2021-02-06 10:59:00 +08:00
result: {err: null},
});
await connection.confirmTransaction(signature, 'confirmed');
2021-02-06 10:59:00 +08:00
return signature;
};
export const helpers = {
airdrop,
processTransaction,
recentBlockhash,
};