@bosonprotocol/core-sdk 1.1.0 → 1.1.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/core-sdk.d.ts +1 -0
- package/dist/cjs/core-sdk.d.ts.map +1 -0
- package/dist/cjs/core-sdk.js +1 -0
- package/dist/cjs/core-sdk.js.map +1 -0
- package/dist/cjs/erc20/handler.d.ts +1 -0
- package/dist/cjs/erc20/handler.d.ts.map +1 -0
- package/dist/cjs/erc20/handler.js +1 -0
- package/dist/cjs/erc20/handler.js.map +1 -0
- package/dist/cjs/erc20/index.d.ts +1 -0
- package/dist/cjs/erc20/index.d.ts.map +1 -0
- package/dist/cjs/erc20/index.js +1 -0
- package/dist/cjs/erc20/index.js.map +1 -0
- package/dist/cjs/erc20/interface.d.ts +1 -0
- package/dist/cjs/erc20/interface.d.ts.map +1 -0
- package/dist/cjs/erc20/interface.js +1 -0
- package/dist/cjs/erc20/interface.js.map +1 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/offers/handler.d.ts +1 -0
- package/dist/cjs/offers/handler.d.ts.map +1 -0
- package/dist/cjs/offers/handler.js +1 -0
- package/dist/cjs/offers/handler.js.map +1 -0
- package/dist/cjs/offers/index.d.ts +53 -52
- package/dist/cjs/offers/index.d.ts.map +1 -0
- package/dist/cjs/offers/index.js +1 -0
- package/dist/cjs/offers/index.js.map +1 -0
- package/dist/cjs/offers/interface.d.ts +2 -1
- package/dist/cjs/offers/interface.d.ts.map +1 -0
- package/dist/cjs/offers/interface.js +1 -0
- package/dist/cjs/offers/interface.js.map +1 -0
- package/dist/cjs/offers/subgraph.d.ts +1 -0
- package/dist/cjs/offers/subgraph.d.ts.map +1 -0
- package/dist/cjs/offers/subgraph.js +1 -0
- package/dist/cjs/offers/subgraph.js.map +1 -0
- package/dist/cjs/offers/types.d.ts +1 -0
- package/dist/cjs/offers/types.d.ts.map +1 -0
- package/dist/cjs/offers/types.js +1 -0
- package/dist/cjs/offers/types.js.map +1 -0
- package/dist/cjs/utils/errors.d.ts +1 -0
- package/dist/cjs/utils/errors.d.ts.map +1 -0
- package/dist/cjs/utils/errors.js +1 -0
- package/dist/cjs/utils/errors.js.map +1 -0
- package/dist/cjs/utils/subgraph.d.ts +1 -0
- package/dist/cjs/utils/subgraph.d.ts.map +1 -0
- package/dist/cjs/utils/subgraph.js +1 -0
- package/dist/cjs/utils/subgraph.js.map +1 -0
- package/dist/esm/core-sdk.d.ts +1 -0
- package/dist/esm/core-sdk.d.ts.map +1 -0
- package/dist/esm/core-sdk.js +1 -0
- package/dist/esm/core-sdk.js.map +1 -0
- package/dist/esm/erc20/handler.d.ts +1 -0
- package/dist/esm/erc20/handler.d.ts.map +1 -0
- package/dist/esm/erc20/handler.js +1 -0
- package/dist/esm/erc20/handler.js.map +1 -0
- package/dist/esm/erc20/index.d.ts +1 -0
- package/dist/esm/erc20/index.d.ts.map +1 -0
- package/dist/esm/erc20/index.js +1 -0
- package/dist/esm/erc20/index.js.map +1 -0
- package/dist/esm/erc20/interface.d.ts +1 -0
- package/dist/esm/erc20/interface.d.ts.map +1 -0
- package/dist/esm/erc20/interface.js +1 -0
- package/dist/esm/erc20/interface.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/offers/handler.d.ts +1 -0
- package/dist/esm/offers/handler.d.ts.map +1 -0
- package/dist/esm/offers/handler.js +1 -0
- package/dist/esm/offers/handler.js.map +1 -0
- package/dist/esm/offers/index.d.ts +53 -52
- package/dist/esm/offers/index.d.ts.map +1 -0
- package/dist/esm/offers/index.js +1 -0
- package/dist/esm/offers/index.js.map +1 -0
- package/dist/esm/offers/interface.d.ts +2 -1
- package/dist/esm/offers/interface.d.ts.map +1 -0
- package/dist/esm/offers/interface.js +1 -0
- package/dist/esm/offers/interface.js.map +1 -0
- package/dist/esm/offers/subgraph.d.ts +1 -0
- package/dist/esm/offers/subgraph.d.ts.map +1 -0
- package/dist/esm/offers/subgraph.js +1 -0
- package/dist/esm/offers/subgraph.js.map +1 -0
- package/dist/esm/offers/types.d.ts +1 -0
- package/dist/esm/offers/types.d.ts.map +1 -0
- package/dist/esm/offers/types.js +1 -0
- package/dist/esm/offers/types.js.map +1 -0
- package/dist/esm/utils/errors.d.ts +1 -0
- package/dist/esm/utils/errors.d.ts.map +1 -0
- package/dist/esm/utils/errors.js +1 -0
- package/dist/esm/utils/errors.js.map +1 -0
- package/dist/esm/utils/subgraph.d.ts +1 -0
- package/dist/esm/utils/subgraph.d.ts.map +1 -0
- package/dist/esm/utils/subgraph.js +1 -0
- package/dist/esm/utils/subgraph.js.map +1 -0
- package/package.json +5 -4
- package/src/core-sdk.ts +170 -0
- package/src/erc20/handler.ts +69 -0
- package/src/erc20/index.ts +2 -0
- package/src/erc20/interface.ts +4 -0
- package/src/index.ts +11 -0
- package/src/offers/handler.ts +80 -0
- package/src/offers/index.ts +12 -0
- package/src/offers/interface.ts +59 -0
- package/src/offers/subgraph.ts +105 -0
- package/src/offers/types.ts +34 -0
- package/src/utils/errors.ts +14 -0
- package/src/utils/subgraph.ts +43 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { utils } from "@bosonprotocol/common";
|
|
2
|
+
|
|
3
|
+
export * as handler from "./handler";
|
|
4
|
+
export * as subgraph from "./subgraph";
|
|
5
|
+
export * as iface from "./interface";
|
|
6
|
+
export * from "./types";
|
|
7
|
+
|
|
8
|
+
export const validation = {
|
|
9
|
+
createOfferArgsSchema: utils.validation.createOfferArgsSchema,
|
|
10
|
+
baseMetadataSchema: utils.validation.baseMetadataSchema,
|
|
11
|
+
productV1MetadataSchema: utils.validation.productV1MetadataSchema
|
|
12
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { OfferStruct, utils, abis, Log } from "@bosonprotocol/common";
|
|
2
|
+
import { Interface } from "@ethersproject/abi";
|
|
3
|
+
import { getAddress } from "@ethersproject/address";
|
|
4
|
+
import { CreateOfferArgs } from "./types";
|
|
5
|
+
|
|
6
|
+
export const bosonOfferHandlerIface = new Interface(abis.IBosonOfferHandlerABI);
|
|
7
|
+
|
|
8
|
+
export function getCreatedOfferIdFromLogs(logs: Log[]) {
|
|
9
|
+
const parsedLogs = logs.map((log) => parseLog(log.data, log.topics));
|
|
10
|
+
|
|
11
|
+
const [offerCreatedLog] = parsedLogs.filter(
|
|
12
|
+
(log) => log.name === "OfferCreated"
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
if (!offerCreatedLog) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return String(offerCreatedLog.args.offerId);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function parseLog(data: string, topics: string[]) {
|
|
23
|
+
return bosonOfferHandlerIface.parseLog({ data, topics });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function encodeCreateOffer(args: CreateOfferArgs) {
|
|
27
|
+
return bosonOfferHandlerIface.encodeFunctionData("createOffer", [
|
|
28
|
+
createOfferArgsToStruct(args)
|
|
29
|
+
]);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function createOfferArgsToStruct(
|
|
33
|
+
args: CreateOfferArgs
|
|
34
|
+
): Partial<OfferStruct> {
|
|
35
|
+
const {
|
|
36
|
+
exchangeToken,
|
|
37
|
+
seller,
|
|
38
|
+
validFromDateInMS,
|
|
39
|
+
validUntilDateInMS,
|
|
40
|
+
redeemableDateInMS,
|
|
41
|
+
fulfillmentPeriodDurationInMS,
|
|
42
|
+
voucherValidDurationInMS,
|
|
43
|
+
...restArgs
|
|
44
|
+
} = args;
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
id: "0",
|
|
48
|
+
...restArgs,
|
|
49
|
+
exchangeToken: getAddress(exchangeToken),
|
|
50
|
+
seller: getAddress(seller),
|
|
51
|
+
validFromDate: utils.timestamp.msToSec(validFromDateInMS),
|
|
52
|
+
validUntilDate: utils.timestamp.msToSec(validUntilDateInMS),
|
|
53
|
+
redeemableDate: utils.timestamp.msToSec(redeemableDateInMS),
|
|
54
|
+
fulfillmentPeriodDuration: utils.timestamp.msToSec(
|
|
55
|
+
fulfillmentPeriodDurationInMS
|
|
56
|
+
),
|
|
57
|
+
voucherValidDuration: utils.timestamp.msToSec(voucherValidDurationInMS)
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { BigNumberish } from "@ethersproject/bignumber";
|
|
2
|
+
import { fetchSubgraph, MultiQueryOpts } from "../utils/subgraph";
|
|
3
|
+
import { RawOfferFromSubgraph } from "./types";
|
|
4
|
+
|
|
5
|
+
export const offerFieldsFragment = `
|
|
6
|
+
fragment offerFields on Offer {
|
|
7
|
+
id
|
|
8
|
+
createdAt
|
|
9
|
+
price
|
|
10
|
+
deposit
|
|
11
|
+
penalty
|
|
12
|
+
quantity
|
|
13
|
+
validFromDate
|
|
14
|
+
validUntilDate
|
|
15
|
+
redeemableDate
|
|
16
|
+
fulfillmentPeriodDuration
|
|
17
|
+
voucherValidDuration
|
|
18
|
+
metadataUri
|
|
19
|
+
metadataHash
|
|
20
|
+
voidedAt
|
|
21
|
+
seller {
|
|
22
|
+
address
|
|
23
|
+
}
|
|
24
|
+
exchangeToken {
|
|
25
|
+
address
|
|
26
|
+
decimals
|
|
27
|
+
name
|
|
28
|
+
symbol
|
|
29
|
+
}
|
|
30
|
+
metadata {
|
|
31
|
+
name
|
|
32
|
+
description
|
|
33
|
+
externalUrl
|
|
34
|
+
schemaUrl
|
|
35
|
+
type
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
`;
|
|
39
|
+
|
|
40
|
+
export const getOfferByIdQuery = `
|
|
41
|
+
query GetOfferById($offerId: ID!) {
|
|
42
|
+
offer(id: $offerId) {
|
|
43
|
+
...offerFields
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
${offerFieldsFragment}
|
|
47
|
+
`;
|
|
48
|
+
|
|
49
|
+
export async function getOfferById(
|
|
50
|
+
subgraphUrl: string,
|
|
51
|
+
offerId: BigNumberish
|
|
52
|
+
): Promise<RawOfferFromSubgraph> {
|
|
53
|
+
const { offer } = await fetchSubgraph<{ offer: RawOfferFromSubgraph }>(
|
|
54
|
+
subgraphUrl,
|
|
55
|
+
getOfferByIdQuery,
|
|
56
|
+
{ offerId: offerId.toString() }
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
return offer;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export const getAllOffersOfSellerQuery = `
|
|
63
|
+
query GetAllOffersOfSellerQuery(
|
|
64
|
+
$seller: ID!,
|
|
65
|
+
$first: Int,
|
|
66
|
+
$skip: Int,
|
|
67
|
+
$orderBy: String,
|
|
68
|
+
$orderDirection: String
|
|
69
|
+
) {
|
|
70
|
+
seller(id: $seller) {
|
|
71
|
+
offers(
|
|
72
|
+
first: $first
|
|
73
|
+
skip: $skip
|
|
74
|
+
orderBy: $orderBy
|
|
75
|
+
orderDirection: $orderDirection
|
|
76
|
+
) {
|
|
77
|
+
...offerFields
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
${offerFieldsFragment}
|
|
82
|
+
`;
|
|
83
|
+
|
|
84
|
+
export async function getAllOffersOfSeller(
|
|
85
|
+
subgraphUrl: string,
|
|
86
|
+
sellerAddress: string,
|
|
87
|
+
opts: MultiQueryOpts = {}
|
|
88
|
+
): Promise<RawOfferFromSubgraph[]> {
|
|
89
|
+
const { seller } = await fetchSubgraph<{
|
|
90
|
+
seller: { offers: RawOfferFromSubgraph[] };
|
|
91
|
+
}>(subgraphUrl, getAllOffersOfSellerQuery, {
|
|
92
|
+
seller: sellerAddress.toLowerCase(),
|
|
93
|
+
first: 100,
|
|
94
|
+
skip: 0,
|
|
95
|
+
orderBy: "createdAt",
|
|
96
|
+
orderDirection: "desc",
|
|
97
|
+
...opts
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
if (!seller) {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return seller.offers;
|
|
105
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export { CreateOfferArgs } from "@bosonprotocol/common";
|
|
2
|
+
|
|
3
|
+
export type RawOfferFromSubgraph = {
|
|
4
|
+
id: string;
|
|
5
|
+
createdAt: string;
|
|
6
|
+
price: string;
|
|
7
|
+
deposit: string;
|
|
8
|
+
penalty: string;
|
|
9
|
+
quantity: string;
|
|
10
|
+
validFromDate: string;
|
|
11
|
+
validUntilDate: string;
|
|
12
|
+
redeemableDate: string;
|
|
13
|
+
fulfillmentPeriodDuration: string;
|
|
14
|
+
voucherValidDuration: string;
|
|
15
|
+
metadataUri: string;
|
|
16
|
+
metadataHash: string;
|
|
17
|
+
voidedAt: null | string;
|
|
18
|
+
seller: {
|
|
19
|
+
address: string;
|
|
20
|
+
};
|
|
21
|
+
exchangeToken: {
|
|
22
|
+
address: string;
|
|
23
|
+
decimals: string;
|
|
24
|
+
name: string;
|
|
25
|
+
symbol: string;
|
|
26
|
+
};
|
|
27
|
+
metadata: null | {
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
externalUrl: string;
|
|
31
|
+
schemaUrl: string;
|
|
32
|
+
type: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export class FetchError extends Error {
|
|
2
|
+
statusCode?: number;
|
|
3
|
+
statusText?: string;
|
|
4
|
+
|
|
5
|
+
constructor(args: {
|
|
6
|
+
message?: string;
|
|
7
|
+
statusCode?: number;
|
|
8
|
+
statusText?: string;
|
|
9
|
+
}) {
|
|
10
|
+
super(args.message);
|
|
11
|
+
this.statusCode = args.statusCode;
|
|
12
|
+
this.statusText = args.statusText;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fetch from "cross-fetch";
|
|
2
|
+
import { FetchError } from "./errors";
|
|
3
|
+
|
|
4
|
+
export type MultiQueryOpts = Partial<{
|
|
5
|
+
first: number;
|
|
6
|
+
skip: number;
|
|
7
|
+
orderBy: string;
|
|
8
|
+
orderDirection: "asc" | "desc";
|
|
9
|
+
}>;
|
|
10
|
+
|
|
11
|
+
export async function fetchSubgraph<T>(
|
|
12
|
+
subgraphUrl: string,
|
|
13
|
+
query: string,
|
|
14
|
+
variables?: Record<string, unknown>
|
|
15
|
+
): Promise<T> {
|
|
16
|
+
const response = await fetch(subgraphUrl, {
|
|
17
|
+
method: "POST",
|
|
18
|
+
headers: {
|
|
19
|
+
"Content-Type": "application/json"
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
query,
|
|
23
|
+
variables
|
|
24
|
+
})
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
throw new FetchError({
|
|
29
|
+
message: `Failed to fetch: ${response.status} ${response.statusText}`,
|
|
30
|
+
statusCode: response.status,
|
|
31
|
+
statusText: response.statusText
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const body = await response.json();
|
|
36
|
+
const { data = {}, errors = [] } = body || {};
|
|
37
|
+
|
|
38
|
+
if (errors.length > 0) {
|
|
39
|
+
throw new Error(`GraphQL errors: ${JSON.stringify(errors)}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return data as T;
|
|
43
|
+
}
|