const fs = require('fs');
const path = require('path');
const { FireblocksSDK } = require('fireblocks-sdk');
const { exit } = require('process');
const { inspect } = require('util');
const axios = require('axios');
const { sign } = require('jsonwebtoken');
const { v4: uuid } = require('uuid');
const crypto = require('crypto');
const apiSecret = fs.readFileSync(path.resolve("`</path/to/fireblocks_secret.key>`"), "utf8");
const apiKey = "<your-api-key-here>"
// Choose the right api url for your workspace type
const baseUrl = "https://sandbox-api.fireblocks.io";
const fireblocks = new FireblocksSDK(apiSecret, apiKey, baseUrl);
class FireblocksRequestHandler{
baseUrl;
apiSecret;
apiKey;
constructor(apiSecret, apiKey, baseUrl = "https://api.fireblocks.io"){
this.baseUrl = baseUrl;
this.apiSecret = apiSecret;
this.apiKey = apiKey;
}
async post(path, data){
const jwt = this.jwtSign(path,data);
return (await this.req(jwt, path, data, "POST"));
}
async get(path) {
const jwt = this.jwtSign(path);
return (await this.req(jwt, path, undefined, "GET"));
}
async req(jwt, path, data, method){
const resp = await axios({
url: `${this.baseUrl}${path}`,
method: method,
data,
headers:{
"X-API-Key":this.apiKey,
"Authorization": `Bearer ${jwt}`
}
});
return resp.data;
}
jwtSign(path, data){
const token = sign({
uri: path,
nonce: uuid(),
iat: Math.floor(Date.now() / 1000),
exp: Math.floor(Date.now() / 1000) + 55,
sub: this.apiKey,
bodyHash: crypto.createHash("sha256").update(JSON.stringify(data || "")).digest().toString("hex")
}, this.apiSecret, {algorithm: "RS256"});
return token;
}
}
(async () => {
const requestHandler = new FireblocksRequestHandler(apiSecret, apiKey);
// Print vaults before creation
let vaults = await requestHandler.get("/v1/vault/accounts_paged");
console.log(inspect(vaults, false, null, true));
// Create vault account
const vaultCreation = await requestHandler.post("/v1/vault/accounts", {"name":"QuickStart_Vault"});
console.log(inspect(vaultCreation, false, null, true));
// Print vaults after creation
vaults = await requestHandler.get("/v1/vault/accounts_paged");
console.log(inspect(vaults, false, null, true));
})().catch((e)=>{
console.error(`Failed: ${e}`);
exit(-1);
});