Skip to content
Merged
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
5 changes: 5 additions & 0 deletions .changeset/fair-bikes-attend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@thirdweb-dev/sdk": patch
---

Improve performance for prebuilt implementations"
Original file line number Diff line number Diff line change
Expand Up @@ -348,8 +348,8 @@ export class Marketplace implements UpdateableNetwork {
);
// derive the offers from the events
return await Promise.all(
listingEvents.map(async (e): Promise<Offer> => {
return await mapOffer(
listingEvents.map((e): Promise<Offer> => {
return mapOffer(
this.contractWrapper.getProvider(),
BigNumber.from(listingId),
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,15 +238,15 @@ export class Multiwrap extends StandardErc721<MultiwrapContract> {
wrappedTokenMetadata: NFTMetadataOrUri,
recipientAddress?: AddressOrEns,
): Promise<Transaction<TransactionResultWithId<NFT>>> => {
const uri = await uploadOrExtractURI(wrappedTokenMetadata, this.storage);

const recipient = await resolveAddress(
recipientAddress
? recipientAddress
: await this.contractWrapper.getSignerAddress(),
);

const tokens = await this.toTokenStructList(contents);
const [uri, tokens, recipient] = await Promise.all([
uploadOrExtractURI(wrappedTokenMetadata, this.storage),
this.toTokenStructList(contents),
resolveAddress(
recipientAddress
? recipientAddress
: await this.contractWrapper.getSignerAddress(),
),
]);

return Transaction.fromContractWrapper({
contractWrapper: this.contractWrapper,
Expand Down
23 changes: 10 additions & 13 deletions packages/sdk/src/evm/contracts/prebuilt-implementations/pack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -436,10 +436,10 @@ export class Pack extends StandardErc1155<PackContract> {
*/
addPackContents = /* @__PURE__ */ buildTransactionFunction(
async (packId: BigNumberish, packContents: PackRewards) => {
const signerAddress = await this.contractWrapper.getSignerAddress();
const parsedContents = await PackRewardsOutputSchema.parseAsync(
packContents,
);
const [signerAddress, parsedContents] = await Promise.all([
this.contractWrapper.getSignerAddress(),
PackRewardsOutputSchema.parseAsync(packContents),
]);
const { contents, numOfRewardUnits } = await this.toPackContentArgs(
parsedContents,
);
Expand Down Expand Up @@ -521,14 +521,11 @@ export class Pack extends StandardErc1155<PackContract> {
to: AddressOrEns,
metadataWithRewards: PackMetadataInput,
): Promise<Transaction<TransactionResultWithId<NFT>>> => {
const uri = await uploadOrExtractURI(
metadataWithRewards.packMetadata,
this.storage,
);

const parsedMetadata = await PackMetadataInputSchema.parseAsync(
metadataWithRewards,
);
const [uri, parsedMetadata, toAddress] = await Promise.all([
uploadOrExtractURI(metadataWithRewards.packMetadata, this.storage),
PackMetadataInputSchema.parseAsync(metadataWithRewards),
resolveAddress(to),
]);
const { erc20Rewards, erc721Rewards, erc1155Rewards } = parsedMetadata;
const rewardsData: PackRewardsOutput = {
erc20Rewards,
Expand All @@ -548,7 +545,7 @@ export class Pack extends StandardErc1155<PackContract> {
uri,
parsedMetadata.openStartTime,
parsedMetadata.rewardsPerPack,
await resolveAddress(to),
toAddress,
],
parse: (receipt) => {
const event = this.contractWrapper.parseLogs<PackCreatedEvent>(
Expand Down
71 changes: 36 additions & 35 deletions packages/sdk/src/evm/contracts/prebuilt-implementations/split.ts
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,11 @@ export class Split implements UpdateableNetwork {
* @returns A map of recipient addresses to their balances in the specified currency.
*/
public async balanceOfTokenAllRecipients(tokenAddress: AddressOrEns) {
const resolvedToken = await resolveAddress(tokenAddress);
const [resolvedToken, recipients] = await Promise.all([
resolveAddress(tokenAddress),
this.getAllRecipients(),
]);

const recipients = await this.getAllRecipients();
const balances: { [key: string]: CurrencyValue } = {};
for (const recipient of recipients) {
balances[recipient.address] = await this.balanceOfToken(
Expand All @@ -206,14 +208,11 @@ export class Split implements UpdateableNetwork {
* ```
*/
public async balanceOf(address: AddressOrEns): Promise<BigNumber> {
const resolvedAddress = await resolveAddress(address);
const walletBalance = await this.contractWrapper
.getProvider()
.getBalance(this.getAddress());
const totalReleased = await this.contractWrapper.read(
"totalReleased" as "totalReleased()",
[],
);
const [resolvedAddress, walletBalance, totalReleased] = await Promise.all([
resolveAddress(address),
this.contractWrapper.getProvider().getBalance(this.getAddress()),
this.contractWrapper.read("totalReleased" as "totalReleased()", []),
]);
const totalReceived = walletBalance.add(totalReleased);

return this._pendingPayment(
Expand Down Expand Up @@ -244,27 +243,30 @@ export class Split implements UpdateableNetwork {
walletAddress: AddressOrEns,
tokenAddress: AddressOrEns,
): Promise<CurrencyValue> {
const resolvedToken = await resolveAddress(tokenAddress);
const resolvedWallet = await resolveAddress(walletAddress);

const [resolvedToken, resolvedWallet] = await Promise.all([
resolveAddress(tokenAddress),
resolveAddress(walletAddress),
]);
const erc20 = new Contract(
resolvedToken,
ERC20Abi,
this.contractWrapper.getProvider(),
) as IERC20;
const walletBalance = await erc20.balanceOf(this.getAddress());
const totalReleased = await this.contractWrapper.read(
"totalReleased" as "totalReleased(address)",
[resolvedToken],
);
const [walletBalance, totalReleased, alreadyReleased] = await Promise.all([
erc20.balanceOf(this.getAddress()),
this.contractWrapper.read("totalReleased" as "totalReleased(address)", [
resolvedToken,
]),
this.contractWrapper.read("released" as "released(address,address)", [
resolvedToken,
resolvedWallet,
]),
]);
const totalReceived = walletBalance.add(totalReleased);
const value = await this._pendingPayment(
resolvedWallet,
totalReceived,
await this.contractWrapper.read(
"released" as "released(address,address)",
[resolvedToken, resolvedWallet],
),
alreadyReleased,
);
return await fetchCurrencyValue(
this.contractWrapper.getProvider(),
Expand All @@ -280,9 +282,8 @@ export class Split implements UpdateableNetwork {
public async getRecipientSplitPercentage(
address: AddressOrEns,
): Promise<SplitRecipient> {
const resolvedAddress = await resolveAddress(address);

const [totalShares, walletsShares] = await Promise.all([
const [resolvedAddress, totalShares, walletsShares] = await Promise.all([
resolveAddress(address),
this.contractWrapper.read("totalShares", []),
this.contractWrapper.read("shares", [address]),
]);
Expand Down Expand Up @@ -333,10 +334,10 @@ export class Split implements UpdateableNetwork {
return Transaction.fromContractWrapper({
contractWrapper: this.contractWrapper,
method: "release(address,address)",
args: [
await resolveAddress(tokenAddress),
await resolveAddress(walletAddress),
],
args: await Promise.all([
resolveAddress(tokenAddress),
resolveAddress(walletAddress),
]),
});
},
);
Expand Down Expand Up @@ -392,14 +393,14 @@ export class Split implements UpdateableNetwork {
totalReceived: BigNumber,
alreadyReleased: BigNumber,
): Promise<BigNumber> {
const [resolvedAddress, totalShares] = await Promise.all([
resolveAddress(address),
this.contractWrapper.read("totalShares", []),
]);
const addressReceived = totalReceived.mul(
await this.contractWrapper.read("shares", [
await resolveAddress(address),
]),
);
const totalRoyaltyAvailable = addressReceived.div(
await this.contractWrapper.read("totalShares", []),
await this.contractWrapper.read("shares", [resolvedAddress]),
);
const totalRoyaltyAvailable = addressReceived.div(totalShares);
return totalRoyaltyAvailable.sub(alreadyReleased);
}

Expand Down
41 changes: 25 additions & 16 deletions packages/sdk/src/evm/contracts/prebuilt-implementations/vote.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,24 +150,33 @@ export class Vote implements UpdateableNetwork {
* @returns - All the proposals in the contract.
*/
public async getAll(): Promise<Proposal[]> {
return Promise.all(
(await this.contractWrapper.read("getAllProposals", [])).map(
async (data) => ({
proposalId: data.proposalId,
proposer: data.proposer,
description: data.description,
startBlock: data.startBlock,
endBlock: data.endBlock,
state: await this.contractWrapper.read("state", [data.proposalId]),
votes: await this.getProposalVotes(data.proposalId),
executions: data[3].map((c, i) => ({
toAddress: data.targets[i],
nativeTokenValue: c,
transactionData: data.calldatas[i],
})),
}),
const _proposals =
(await this.contractWrapper.read("getAllProposals", [])) ?? [];
const _items = await Promise.all(
_proposals.map((item) =>
Promise.all([
this.contractWrapper.read("state", [item.proposalId]),
this.getProposalVotes(item.proposalId),
]),
),
);
return _items.map(([state, votes], index) => {
const data = _proposals[index];
return {
proposalId: data.proposalId,
proposer: data.proposer,
description: data.description,
startBlock: data.startBlock,
endBlock: data.endBlock,
state: state,
votes: votes,
executions: data[3].map((c, i) => ({
toAddress: data.targets[i],
nativeTokenValue: c,
transactionData: data.calldatas[i],
})),
};
});
}

/**
Expand Down