1
0
mirror of https://github.com/oceanprotocol-archive/squid-js.git synced 2024-02-02 15:31:51 +01:00
squid-js/src/ocean.ts

154 lines
5.8 KiB
TypeScript
Raw Normal View History

2018-09-25 10:23:44 +02:00
import BigNumber from "bignumber.js";
2018-09-25 09:14:01 +02:00
import OceanAuth from "./keeper/auth";
import OceanMarket from "./keeper/market";
import OceanToken from "./keeper/token";
import MetaData from "./metadata";
2018-09-25 08:30:54 +02:00
import Config from "./utils/config";
2018-09-25 09:14:01 +02:00
import Logger from "./utils/logger";
import Web3Helper from "./utils/Web3Helper";
2018-09-19 10:30:30 +02:00
export default class Ocean {
2018-09-25 09:14:01 +02:00
public static async getInstance(config) {
const ocean = new Ocean(config);
ocean.market = await OceanMarket.getInstance(config, ocean.helper);
ocean.auth = await OceanAuth.getInstance(config, ocean.helper);
ocean.token = await OceanToken.getInstance(config, ocean.helper);
return ocean;
}
2018-09-25 08:30:54 +02:00
public token: OceanToken;
public market: OceanMarket;
public auth: OceanAuth;
public helper: Web3Helper;
public metadata: MetaData;
2018-09-25 09:14:01 +02:00
private config: Config;
2018-09-19 10:30:30 +02:00
2018-09-25 09:14:01 +02:00
private constructor(config: Config) {
2018-09-25 09:14:01 +02:00
this.config = config;
2018-09-19 10:30:30 +02:00
2018-09-25 09:14:01 +02:00
this.helper = new Web3Helper(config);
this.metadata = new MetaData(config);
2018-09-19 10:30:30 +02:00
}
2018-09-25 09:14:01 +02:00
public async getAccounts() {
2018-09-25 08:30:54 +02:00
return Promise.all((await this.helper.getAccounts()).map(async (account: string) => {
2018-09-20 10:18:02 +02:00
// await ocean.market.requestTokens(account, 1000)
2018-09-25 09:14:01 +02:00
const {token} = this;
2018-09-20 10:18:02 +02:00
return {
name: account,
balance: {
2018-09-25 09:14:01 +02:00
eth: await token.getEthBalance(account),
ocn: await token.getTokenBalance(account),
},
};
}));
2018-09-20 10:18:02 +02:00
}
2018-09-25 09:14:01 +02:00
public async getOrdersByConsumer(consumerAddress: string) {
const {auth} = this;
const accessConsentEvent = auth.contract.AccessConsentRequested({_consumer: consumerAddress}, {
2018-09-19 10:30:30 +02:00
fromBlock: 0,
2018-09-25 09:14:01 +02:00
toBlock: "latest",
});
2018-09-19 10:30:30 +02:00
2018-09-25 09:14:01 +02:00
let outerResolve = null;
let outerReject = null;
2018-09-25 08:30:54 +02:00
const promise = new Promise<any[]>((resolve, reject) => {
2018-09-25 09:14:01 +02:00
outerResolve = resolve;
outerReject = reject;
});
2018-09-19 10:30:30 +02:00
2018-09-25 08:30:54 +02:00
const getEvents = (): Promise<any[]> => {
accessConsentEvent.get((error: any, logs: any[]) => {
2018-09-19 10:30:30 +02:00
if (error) {
2018-09-25 09:14:01 +02:00
outerReject(error);
throw new Error(error);
2018-09-19 10:30:30 +02:00
} else {
2018-09-25 09:14:01 +02:00
outerResolve(logs);
2018-09-19 10:30:30 +02:00
}
2018-09-25 09:14:01 +02:00
});
return promise;
};
const events = await getEvents().then((result) => result);
2018-09-19 10:30:30 +02:00
// let orders = await this.buildOrdersFromEvents(events, consumerAddress).then((result) => result)
2018-09-25 09:14:01 +02:00
const orders = events
2018-09-25 08:30:54 +02:00
.filter((obj: any) => (obj.args._consumer === consumerAddress))
.map(async (event: any) => ({
2018-09-19 10:30:30 +02:00
...event.args,
timeout: event.args._timeout.toNumber(),
2018-09-25 08:30:54 +02:00
status: await this.auth.getOrderStatus(event.args._id)
.then((status: BigNumber) => status.toNumber()),
paid: this.market.verifyOrderPayment(event.args._id),
2018-09-25 09:14:01 +02:00
key: null,
}));
Logger.debug("got orders: ", orders);
return orders;
2018-09-19 10:30:30 +02:00
}
2018-09-25 09:14:01 +02:00
public async purchaseAsset(
assetId: string, publisherId: string, price: number, privateKey: string, publicKey: string, timeout: number,
senderAddress: string, initialRequestEventHandler, accessCommittedEventHandler, tokenPublishedEventHandler) {
const {token, market, auth, config} = this;
try {
2018-09-25 09:14:01 +02:00
// Allow market contract to transfer funds on the consumer"s behalf
await token.contract.approve(market.contract.address, price, {from: senderAddress, gas: config.defaultGas});
} catch (err) {
2018-09-25 09:14:01 +02:00
Logger.log("token approve", err);
}
try {
// Submit the access request
await auth.contract.initiateAccessRequest(
assetId, publisherId, publicKey,
2018-09-25 09:14:01 +02:00
timeout, {from: senderAddress, gas: 1000000},
);
} catch (err) {
2018-09-25 09:14:01 +02:00
Logger.log("initiateAccessRequest", err);
}
2018-09-25 09:14:01 +02:00
const resourceFilter = {_resourceId: assetId, _consumer: senderAddress};
const initRequestEvent = auth.contract.AccessConsentRequested(resourceFilter);
let order: any = {};
2018-09-19 10:30:30 +02:00
this._listenOnce(
initRequestEvent,
2018-09-25 09:14:01 +02:00
"AccessConsentRequested",
2018-09-25 08:30:54 +02:00
(result: any, error: any) => {
2018-09-25 09:14:01 +02:00
order = initialRequestEventHandler(result, error);
const requestIdFilter = {_id: order.id};
const accessCommittedEvent = auth.contract.AccessRequestCommitted(requestIdFilter);
const tokenPublishedEvent = auth.contract.EncryptedTokenPublished(requestIdFilter);
2018-09-19 10:30:30 +02:00
this._listenOnce(
accessCommittedEvent,
2018-09-25 09:14:01 +02:00
"AccessRequestCommitted",
(accessRequestCommittedResult: any, accessRequestCommittedError: any) => {
accessCommittedEventHandler(accessRequestCommittedResult, order, accessRequestCommittedError);
},
);
2018-09-19 10:30:30 +02:00
this._listenOnce(
tokenPublishedEvent,
2018-09-25 09:14:01 +02:00
"EncryptedTokenPublished",
(encryptedTokenPublishedResult: any, encryptedTokenPublishedError: any) => {
tokenPublishedEventHandler(encryptedTokenPublishedResult, order, encryptedTokenPublishedError);
},
);
});
return order;
2018-09-19 10:30:30 +02:00
}
// Helper functions (private)
2018-09-25 09:14:01 +02:00
public _listenOnce(event: any, eventName: string, callback) {
2018-09-19 10:30:30 +02:00
// eslint-disable-next-line security/detect-non-literal-fs-filename
2018-09-25 08:30:54 +02:00
event.watch((error: any, result: any) => {
2018-09-25 09:14:01 +02:00
event.stopWatching();
2018-09-19 10:30:30 +02:00
if (error) {
2018-09-25 09:14:01 +02:00
Logger.log(`Error in keeper ${eventName} event: `, error);
2018-09-19 10:30:30 +02:00
}
2018-09-25 09:14:01 +02:00
callback(result, error);
});
2018-09-19 10:30:30 +02:00
}
}