Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions e2e/tests/accounts.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { MSEC_PER_DAY, MSEC_PER_SEC } from './../../packages/common/src/utils/timestamp';

import { utils, constants, Wallet } from "ethers";

import { MSEC_PER_DAY, MSEC_PER_SEC } from '../../packages/common/src/utils/timestamp';
import { CoreSDK } from "../../packages/core-sdk/src";

import {
initCoreSDKWithFundedWallet,
ensureCreatedSeller,
Expand Down Expand Up @@ -226,11 +226,10 @@ describe("CoreSDK - accounts", () => {
});

test("add sellers", async () => {
const [sellers, { coreSDK, fundedWallet }] = await Promise.all([
const [seller, { coreSDK, fundedWallet }] = await Promise.all([
ensureCreatedSeller(sellerWallet),
initCoreSDKWithFundedWallet(protocolAdminWallet)
]);
const [seller] = sellers;
const disputeResolverAddress = fundedWallet.address.toLowerCase();

const { disputeResolver } = await createDisputeResolver(
Expand Down Expand Up @@ -266,11 +265,10 @@ describe("CoreSDK - accounts", () => {
});

test("remove sellers", async () => {
const [sellers, { coreSDK, fundedWallet }] = await Promise.all([
const [seller, { coreSDK, fundedWallet }] = await Promise.all([
ensureCreatedSeller(sellerWallet),
initCoreSDKWithFundedWallet(protocolAdminWallet)
]);
const [seller] = sellers;
const disputeResolverAddress = fundedWallet.address.toLowerCase();

const { disputeResolver: disputeResolverBeforeUpdate } =
Expand Down
15 changes: 5 additions & 10 deletions e2e/tests/core-sdk.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,7 @@ describe("core-sdk", () => {
const { coreSDK, fundedWallet } = await initCoreSDKWithFundedWallet(
seedWallet
);
const sellers = await ensureCreatedSeller(fundedWallet);
const [seller] = sellers;
const seller = await ensureCreatedSeller(fundedWallet);

const funds = await depositFunds({
coreSDK,
Expand All @@ -113,8 +112,7 @@ describe("core-sdk", () => {
const { coreSDK, fundedWallet } = await initCoreSDKWithFundedWallet(
seedWallet
);
const sellers = await ensureCreatedSeller(fundedWallet);
const [seller] = sellers;
const seller = await ensureCreatedSeller(fundedWallet);

await ensureMintedAndAllowedTokens([fundedWallet], sellerFundsDeposit);

Expand Down Expand Up @@ -312,8 +310,7 @@ describe("core-sdk", () => {
const { coreSDK, fundedWallet } = await initCoreSDKWithFundedWallet(
seedWallet
);
const sellers = await ensureCreatedSeller(fundedWallet);
const [seller] = sellers;
const seller = await ensureCreatedSeller(fundedWallet);

const funds = await depositFunds({
coreSDK,
Expand Down Expand Up @@ -341,8 +338,7 @@ describe("core-sdk", () => {
const { coreSDK, fundedWallet } = await initCoreSDKWithFundedWallet(
seedWallet
);
const sellers = await ensureCreatedSeller(fundedWallet);
const [seller] = sellers;
const seller = await ensureCreatedSeller(fundedWallet);

const ethFunds = await depositFunds({
coreSDK,
Expand Down Expand Up @@ -582,8 +578,7 @@ describe("core-sdk", () => {

const sellerId = seller.id;

const sellers2 = await coreSDK.getSellersByAddress(fundedWallet.address);
const [seller2] = sellers2;
const seller2 = await coreSDK.getSellerByAddress(fundedWallet.address);
expect(seller2).toBeTruthy();
expect(seller2.id).toEqual(sellerId);
});
Expand Down
5 changes: 2 additions & 3 deletions e2e/tests/meta-tx.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ describe("meta-tx", () => {
const nonce = Date.now();
const newSellerCoreSDK = initCoreSDKWithWallet(newSellerWallet);

const [existingSeller] = await newSellerCoreSDK.getSellersByAddress(
const existingSeller = await newSellerCoreSDK.getSellerByAddress(
newSellerWallet.address
);

Expand Down Expand Up @@ -330,8 +330,7 @@ describe("meta-tx", () => {

async function createOfferAndDepositFunds(sellerWallet: Wallet) {
const sellerCoreSDK = initCoreSDKWithWallet(sellerWallet);
const sellers = await sellerCoreSDK.getSellersByAddress(sellerAddress);
const [seller] = sellers;
const seller = await sellerCoreSDK.getSellerByAddress(sellerAddress);
// Store metadata
const metadataHash = await sellerCoreSDK.storeMetadata({
...metadata,
Expand Down
3 changes: 1 addition & 2 deletions e2e/tests/productV1.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,7 @@ async function createOffer(
sellerWallet: Wallet,
offerArgs: CreateOfferArgs
) {
const sellers = await ensureCreatedSeller(sellerWallet);
const [seller] = sellers;
const seller = await ensureCreatedSeller(sellerWallet);
// Check the disputeResolver exists and is active
const disputeResolverId = offerArgs.disputeResolverId;

Expand Down
8 changes: 4 additions & 4 deletions e2e/tests/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -222,9 +222,9 @@ export async function createFundedWallet(
export async function ensureCreatedSeller(sellerWallet: Wallet) {
const sellerAddress = sellerWallet.address;
const sellerCoreSDK = initCoreSDKWithWallet(sellerWallet);
let sellers = await sellerCoreSDK.getSellersByAddress(sellerAddress);
let seller = await sellerCoreSDK.getSellerByAddress(sellerAddress);

if (!sellers.length) {
if (!seller) {
const tx = await sellerCoreSDK.createSeller({
operator: sellerAddress,
treasury: sellerAddress,
Expand All @@ -238,10 +238,10 @@ export async function ensureCreatedSeller(sellerWallet: Wallet) {
});
await tx.wait();
await waitForGraphNodeIndexing();
sellers = await sellerCoreSDK.getSellersByAddress(sellerAddress);
seller = await sellerCoreSDK.getSellerByAddress(sellerAddress);
}

return sellers;
return seller;
}

export async function ensureMintedAndAllowedTokens(
Expand Down
92 changes: 88 additions & 4 deletions packages/core-sdk/src/accounts/handler.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
import {
Web3LibAdapter,
TransactionResponse,
utils
utils,
AuthTokenType
} from "@bosonprotocol/common";
import { BigNumberish } from "@ethersproject/bignumber";
import { DisputeResolverFieldsFragment } from "../subgraph";
import { BigNumberish, BigNumber } from "@ethersproject/bignumber";
import { AddressZero } from "@ethersproject/constants";
import {
DisputeResolverFieldsFragment,
GetSellersQueryQueryVariables,
SellerFieldsFragment
} from "../subgraph";
import {
encodeCreateSeller,
encodeUpdateSeller,
Expand All @@ -16,7 +22,12 @@ import {
encodeRemoveSellersFromAllowList,
encodeUpdateDisputeResolver
} from "./interface";
import { getDisputeResolverById } from "./subgraph";
import {
getDisputeResolverById,
getSellerByAddress,
getSellerByAuthToken
} from "./subgraph";
import * as erc721Handler from "../erc721/handler";
import {
CreateSellerArgs,
UpdateSellerArgs,
Expand All @@ -25,6 +36,79 @@ import {
DisputeResolverUpdates
} from "./types";

export async function getSellersByAddressOrAuthToken(args: {
lensHubContractAddress?: string;
accountAddress: string;
web3Lib: Web3LibAdapter;
queryVars?: GetSellersQueryQueryVariables;
subgraphUrl: string;
}): Promise<SellerFieldsFragment[]> {
if (args.accountAddress === AddressZero) {
throw new Error(`Unsupported search address '${AddressZero}'`);
}
const seller = await getSellerByAddress(
args.subgraphUrl,
args.accountAddress,
args.queryVars
);
if (!seller && args.lensHubContractAddress) {
// If seller is not found per address, try to find per authToken
const tokenType = AuthTokenType.LENS; // only LENS for now
const tokenIds = await fetchAuthTokensOfAccount({
...args,
tokenType
});
const promises: Promise<SellerFieldsFragment>[] = [];
for (const tokenId of tokenIds) {
// Just in case the user owns several auth tokens
const sellerPromise = getSellerByAuthToken(
args.subgraphUrl,
tokenId,
tokenType,
args.queryVars
);
promises.push(sellerPromise);
}
return (await Promise.all(promises)).filter((seller) => !!seller);
}
return [seller].filter((seller) => !!seller);
}

export async function fetchAuthTokensOfAccount(args: {
lensHubContractAddress?: string;
accountAddress: string;
tokenType: number;
web3Lib: Web3LibAdapter;
}): Promise<Array<string>> {
if (args.tokenType !== AuthTokenType.LENS) {
// only LENS for now
throw new Error(`Unsupported authTokenType '${args.tokenType}'`);
}

if (!args.lensHubContractAddress) {
throw new Error("LENS contract is not configured in Core-SDK");
}

const balance = await erc721Handler.balanceOf({
contractAddress: args.lensHubContractAddress,
owner: args.accountAddress,
web3Lib: args.web3Lib
});

const balanceBN = BigNumber.from(balance);
const tokenIdPromises: Promise<string>[] = [];
for (let index = 0; balanceBN.gt(index); index++) {
const tokenIdPromise = erc721Handler.tokenOfOwnerByIndex({
contractAddress: args.lensHubContractAddress,
owner: args.accountAddress,
index,
web3Lib: args.web3Lib
});
tokenIdPromises.push(tokenIdPromise);
}
return Promise.all(tokenIdPromises);
}

export async function createSeller(args: {
sellerToCreate: CreateSellerArgs;
contractAddress: string;
Expand Down
6 changes: 6 additions & 0 deletions packages/core-sdk/src/accounts/subgraph.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { AuthTokenType } from "@bosonprotocol/common";
import { getSubgraphSdk } from "../utils/graphql";
import {
BuyerFieldsFragment,
Expand Down Expand Up @@ -137,6 +138,11 @@ export async function getSellerByAuthToken(
tokenType: number,
queryVars: GetSellersQueryQueryVariables = {}
): Promise<SellerFieldsFragment> {
if (tokenType !== AuthTokenType.LENS) {
// only LENS for now
throw new Error(`Unsupported authTokenType '${tokenType}'`);
}

const sellers = await getSellers(subgraphUrl, {
sellersFilter: {
...queryVars.sellersFilter,
Expand Down
71 changes: 14 additions & 57 deletions packages/core-sdk/src/core-sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,73 +278,34 @@ export class CoreSDK {
* @param queryVars - Optional query variables to skip, order or filter.
* @returns Seller entity from subgraph.
*/
public async getSellersByAddress(
public async getSellerByAddress(
address: string,
queryVars?: subgraph.GetSellersQueryQueryVariables
): Promise<subgraph.SellerFieldsFragment[]> {
if (address === AddressZero) {
throw new Error(`Unsupported search address '${AddressZero}'`);
}
const seller = await accounts.subgraph.getSellerByAddress(
): Promise<subgraph.SellerFieldsFragment> {
return accounts.subgraph.getSellerByAddress(
this._subgraphUrl,
address,
queryVars
);
if (!seller && this._lensContracts?.LENS_HUB_CONTRACT) {
// If seller is not found per address, try to find per authToken
const tokenType = AuthTokenType.LENS; // only LENS for now
const tokenIds = await this.fetchUserAuthTokens(address, tokenType);
const promises: Promise<subgraph.SellerFieldsFragment>[] = [];
for (const tokenId of tokenIds) {
// Just in case the user owns several auth tokens
const sellerPromise = this.getSellerByAuthToken(
tokenId,
tokenType,
queryVars
);
promises.push(sellerPromise);
}
return (await Promise.all(promises)).filter((seller) => !!seller);
}
return [seller].filter((seller) => !!seller);
}

/**
* Returns the array of LENS tokenIds owned by a specified address
* Returns all seller entities from subgraph by either matching address or auth token.
* @param address - Address of seller entity to query for.
* @param queryVars - Optional query variables to skip, order or filter.
* @returns Array of tokenIds
* @returns Seller entity from subgraph.
*/
public async fetchUserAuthTokens(
public async getSellersByAddressOrAuthToken(
address: string,
tokenType: number
): Promise<Array<string>> {
if (tokenType !== AuthTokenType.LENS) {
// only LENS for now
throw new Error(`Unsupported authTokenType '${tokenType}'`);
}
if (!this._lensContracts || !this._lensContracts?.LENS_HUB_CONTRACT) {
throw new Error("LENS contract is not configured in Core-SDK");
}
const balance = await erc721.handler.balanceOf({
contractAddress: this._lensContracts?.LENS_HUB_CONTRACT,
owner: address,
web3Lib: this._web3Lib
queryVars?: subgraph.GetSellersQueryQueryVariables
): Promise<subgraph.SellerFieldsFragment[]> {
return accounts.handler.getSellersByAddressOrAuthToken({
lensHubContractAddress: this._lensContracts?.LENS_HUB_CONTRACT,
accountAddress: address,
web3Lib: this._web3Lib,
queryVars: queryVars,
subgraphUrl: this._subgraphUrl
});

const balanceBN = BigNumber.from(balance);
const promises: Promise<string>[] = [];
for (let index = 0; balanceBN.gt(index); index++) {
const tokenIdPromise = erc721.handler.tokenOfOwnerByIndex({
contractAddress: this._lensContracts?.LENS_HUB_CONTRACT,
owner: address,
index,
web3Lib: this._web3Lib
});
promises.push(tokenIdPromise);
}
const ret = await Promise.all(promises);
return ret;
}

/**
Expand All @@ -359,10 +320,6 @@ export class CoreSDK {
tokenType: number,
queryVars?: subgraph.GetSellersQueryQueryVariables
): Promise<subgraph.SellerFieldsFragment> {
if (tokenType !== AuthTokenType.LENS) {
// only LENS for now
throw new Error(`Unsupported authTokenType '${tokenType}'`);
}
return accounts.subgraph.getSellerByAuthToken(
this._subgraphUrl,
tokenId,
Expand Down
Loading