Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement CryptoCreate handle method #6112

Merged
merged 61 commits into from May 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
55e847d
initial commit
Neeharika-Sompalli Apr 12, 2023
fe3e427
initial commit
Neeharika-Sompalli Apr 12, 2023
27eed4f
Merge branch 'develop' into 6038-D-crypto-create-handler
Neeharika-Sompalli Apr 13, 2023
28369bb
Merge branch 'develop' into 6038-D-crypto-create-handler
Neeharika-Sompalli Apr 13, 2023
cf6293d
Merge branch 'develop' into 6038-D-crypto-create-handler
Neeharika-Sompalli Apr 13, 2023
1034b6e
midway
Neeharika-Sompalli Apr 14, 2023
99b9021
Merge branch 'develop' into 6038-D-crypto-create-handler
Neeharika-Sompalli Apr 14, 2023
5e6390b
Merge branch 'develop' into 6038-D-crypto-create-handler
Neeharika-Sompalli Apr 14, 2023
5627b63
Merge branch 'develop' into move-to-account-pbj-type
Neeharika-Sompalli Apr 14, 2023
a7390a3
spotless
Neeharika-Sompalli Apr 14, 2023
4ace0b8
Merge branch 'develop' into move-to-account-pbj-type
Neeharika-Sompalli Apr 14, 2023
ed14857
revert not needed spotless
Neeharika-Sompalli Apr 15, 2023
c614b84
fix spotless chnages
Neeharika-Sompalli Apr 15, 2023
c44fe36
fix spotless chnages
Neeharika-Sompalli Apr 15, 2023
d6a086d
fix the known accounts for parity tests. Also change allowances in pr…
Neeharika-Sompalli Apr 17, 2023
7868843
spotless
Neeharika-Sompalli Apr 17, 2023
ae28d21
spotless
Neeharika-Sompalli Apr 17, 2023
e07e234
initial commit to add crypto create handle implementation
Neeharika-Sompalli Apr 17, 2023
43eca82
fix test
Neeharika-Sompalli Apr 17, 2023
a03a0c5
fix tests
Neeharika-Sompalli Apr 17, 2023
24a13c3
fix schedule tests
Neeharika-Sompalli Apr 17, 2023
04bb25a
fix token service tests
Neeharika-Sompalli Apr 17, 2023
13837e4
fix all service tests
Neeharika-Sompalli Apr 17, 2023
c2e7b1f
add `isValid` method
Neeharika-Sompalli Apr 17, 2023
7601ece
add `isValid` method
Neeharika-Sompalli Apr 17, 2023
0c98e1c
spotless and minor fixes
Neeharika-Sompalli Apr 17, 2023
bfc5f64
Merge branch 'move-to-account-pbj-type' into 6038-D-crypto-create-han…
Neeharika-Sompalli Apr 17, 2023
9174cce
Merge branch 'develop' into move-to-account-pbj-type
Neeharika-Sompalli Apr 18, 2023
d4d3eeb
address review comments
Neeharika-Sompalli Apr 18, 2023
6af87d3
Merge branch 'develop' into move-to-account-pbj-type
Neeharika-Sompalli Apr 18, 2023
7e648b3
add one more test for key utils
Neeharika-Sompalli Apr 18, 2023
2841cce
Add Nullable
Neeharika-Sompalli Apr 18, 2023
74bcb3e
update branch
Neeharika-Sompalli Apr 18, 2023
3de613d
Merge branch 'move-to-account-pbj-type' into 6038-D-crypto-create-han…
Neeharika-Sompalli Apr 18, 2023
f81f06c
compile errors
Neeharika-Sompalli Apr 18, 2023
23afe12
Merge develop
Neeharika-Sompalli Apr 19, 2023
a7137b3
compile errors
Neeharika-Sompalli Apr 19, 2023
c7735ba
add tests
Neeharika-Sompalli Apr 19, 2023
a40c9f1
add tests
Neeharika-Sompalli Apr 20, 2023
0171a87
more tests and spotless
Neeharika-Sompalli Apr 20, 2023
cdb4f57
more tests and spotless
Neeharika-Sompalli Apr 20, 2023
a165cb6
Merge branch 'develop' into 6038-D-crypto-create-handler-impl
Neeharika-Sompalli Apr 20, 2023
27e54a1
more tests and spotless
Neeharika-Sompalli Apr 20, 2023
41c157e
Merge remote-tracking branch 'origin/6038-D-crypto-create-handler-imp…
Neeharika-Sompalli Apr 20, 2023
854b5b2
tests
Neeharika-Sompalli Apr 20, 2023
a0aea6d
spotless
Neeharika-Sompalli Apr 20, 2023
b58e4f3
more sonar
Neeharika-Sompalli Apr 20, 2023
c744cdf
Merge branch 'develop' into 6038-D-crypto-create-handler-impl
Neeharika-Sompalli Apr 25, 2023
c73346d
Merge branch 'develop' into 6038-D-crypto-create-handler-impl
Neeharika-Sompalli Apr 27, 2023
3aa192a
compile errors
Neeharika-Sompalli Apr 27, 2023
77f22dc
compile errors
Neeharika-Sompalli Apr 27, 2023
fcad5f2
compile errors and review comments
Neeharika-Sompalli Apr 28, 2023
ce770df
fix unit test
Neeharika-Sompalli Apr 28, 2023
64a45b5
Merge branch 'develop' into 6038-D-crypto-create-handler-impl
Neeharika-Sompalli Apr 28, 2023
8cbb42c
add log
Neeharika-Sompalli Apr 28, 2023
db50198
Merge branch 'develop' into 6038-D-crypto-create-handler-impl
Neeharika-Sompalli May 1, 2023
18ab0d5
address review comments
Neeharika-Sompalli May 1, 2023
a7f5d13
Merge branch 'develop' into 6038-D-crypto-create-handler-impl
Neeharika-Sompalli May 3, 2023
d726a8d
address review comments
Neeharika-Sompalli May 3, 2023
a8b46e9
address review comments
Neeharika-Sompalli May 3, 2023
6103e27
Merge branch 'develop' into 6038-D-crypto-create-handler-impl
Neeharika-Sompalli May 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -16,8 +16,10 @@

package com.hedera.node.app.workflows.dispatcher;

import static com.hedera.hapi.node.base.ResponseCodeEnum.MAX_ENTITIES_IN_PRICE_REGIME_HAVE_BEEN_CREATED;
import static java.util.Objects.requireNonNull;

import com.hedera.hapi.node.base.AccountID;
import com.hedera.hapi.node.base.TopicID;
import com.hedera.node.app.service.consensus.impl.WritableTopicStore;
import com.hedera.node.app.service.consensus.impl.records.ConsensusCreateTopicRecordBuilder;
Expand All @@ -26,8 +28,11 @@
import com.hedera.node.app.service.mono.context.properties.GlobalDynamicProperties;
import com.hedera.node.app.service.mono.pbj.PbjConverter;
import com.hedera.node.app.service.mono.state.validation.UsageLimits;
import com.hedera.node.app.service.token.impl.WritableAccountStore;
import com.hedera.node.app.service.token.impl.WritableTokenRelationStore;
import com.hedera.node.app.service.token.impl.records.CryptoCreateRecordBuilder;
import com.hedera.node.app.spi.meta.HandleContext;
import com.hedera.node.app.spi.workflows.HandleException;
import edu.umd.cs.findbugs.annotations.NonNull;
import javax.inject.Inject;
import javax.inject.Singleton;
Expand Down Expand Up @@ -69,6 +74,20 @@ protected void finishConsensusCreateTopic(
topicStore.commit();
}

@Override
protected void finishCryptoCreate(
@NonNull final CryptoCreateRecordBuilder recordBuilder, @NonNull final WritableAccountStore accountStore) {
// If accounts can't be created, due to the usage of a price regime, throw an exception
if (!usageLimits.areCreatableAccounts(1)) {
throw new HandleException(MAX_ENTITIES_IN_PRICE_REGIME_HAVE_BEEN_CREATED);
}
// Adapt the record builder outcome for mono-service
txnCtx.setCreated(PbjConverter.fromPbj(AccountID.newBuilder()
.accountNum(recordBuilder.getCreatedAccount())
.build()));
accountStore.commit();
}

@Override
protected void finishConsensusUpdateTopic(@NonNull WritableTopicStore topicStore) {
topicStore.commit();
Expand Down
Expand Up @@ -29,8 +29,10 @@
import com.hedera.node.app.service.consensus.impl.records.ConsensusCreateTopicRecordBuilder;
import com.hedera.node.app.service.consensus.impl.records.ConsensusSubmitMessageRecordBuilder;
import com.hedera.node.app.service.mono.context.properties.GlobalDynamicProperties;
import com.hedera.node.app.service.token.impl.WritableAccountStore;
import com.hedera.node.app.service.token.impl.WritableTokenRelationStore;
import com.hedera.node.app.service.token.impl.WritableTokenStore;
import com.hedera.node.app.service.token.impl.records.CryptoCreateRecordBuilder;
import com.hedera.node.app.spi.meta.HandleContext;
import com.hedera.node.app.spi.workflows.HandleException;
import com.hedera.node.app.spi.workflows.PreCheckException;
Expand Down Expand Up @@ -103,6 +105,7 @@
txn, writableStoreFactory.createTokenRelStore());
case TOKEN_PAUSE -> dispatchTokenPause(txn, writableStoreFactory.createTokenStore());
case TOKEN_UNPAUSE -> dispatchTokenUnpause(txn, writableStoreFactory.createTokenStore());
case CRYPTO_CREATE -> dispatchCryptoCreate(txn, writableStoreFactory.createAccountStore());
default -> throw new IllegalArgumentException(TYPE_NOT_SUPPORTED);
}
}
Expand Down Expand Up @@ -361,4 +364,30 @@
handler.handle(tokenPause, tokenStore);
tokenStore.commit();
}

/**
* Dispatches the crypto create transaction to the appropriate handler.
* @param cryptoCreate the crypto create transaction body
* @param accountStore the writable account store
*/
private void dispatchCryptoCreate(
tinker-michaelj marked this conversation as resolved.
Show resolved Hide resolved
@NonNull final TransactionBody cryptoCreate, @NonNull final WritableAccountStore accountStore) {
final var handler = handlers.cryptoCreateHandler();
final var recordBuilder = handler.newRecordBuilder();
handler.handle(handleContext, cryptoCreate, accountStore, recordBuilder);
finishCryptoCreate(recordBuilder, accountStore);
}

/**
* A temporary hook to isolate logic that we expect to move to a workflow, but
* is currently needed when running with facility implementations that are adapters
* for either {@code mono-service} logic or integration tests.
*
* @param recordBuilder the completed record builder for the creation
* @param accountStore the account store used for the creation
*/
protected void finishCryptoCreate(
@NonNull final CryptoCreateRecordBuilder recordBuilder, @NonNull final WritableAccountStore accountStore) {
// No-op by default
}

Check warning on line 392 in hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcher.java

View check run for this annotation

Codecov / codecov/patch

hedera-node/hedera-app/src/main/java/com/hedera/node/app/workflows/dispatcher/TransactionDispatcher.java#L392

Added line #L392 was not covered by tests
}
Expand Up @@ -21,6 +21,7 @@
import com.hedera.node.app.service.consensus.ConsensusService;
import com.hedera.node.app.service.consensus.impl.WritableTopicStore;
import com.hedera.node.app.service.token.TokenService;
import com.hedera.node.app.service.token.impl.WritableAccountStore;
import com.hedera.node.app.service.token.impl.WritableTokenRelationStore;
import com.hedera.node.app.service.token.impl.WritableTokenStore;
import com.hedera.node.app.state.HederaState;
Expand Down Expand Up @@ -74,4 +75,10 @@ public WritableTokenRelationStore createTokenRelStore() {
final var tokenStates = stateAccessor.getHederaState().createWritableStates(TokenService.NAME);
return new WritableTokenRelationStore(tokenStates);
}

@Override
public WritableAccountStore createAccountStore() {
final var tokenStates = stateAccessor.getHederaState().createWritableStates(TokenService.NAME);
return new WritableAccountStore(tokenStates);
}
}
Expand Up @@ -17,6 +17,7 @@
package com.hedera.node.app.workflows.dispatcher;

import com.hedera.node.app.service.consensus.impl.WritableTopicStore;
import com.hedera.node.app.service.token.impl.WritableAccountStore;
import com.hedera.node.app.service.token.impl.WritableTokenRelationStore;
import com.hedera.node.app.service.token.impl.WritableTokenStore;

Expand All @@ -43,5 +44,12 @@ public interface WritableStoreFactory {
*
* @return a new {@link WritableTokenRelationStore}
*/
public WritableTokenRelationStore createTokenRelStore();
WritableTokenRelationStore createTokenRelStore();

/**
* Get a {@link WritableAccountStore}.
*
* @return a new {@link WritableAccountStore}
*/
WritableAccountStore createAccountStore();
}
Expand Up @@ -26,6 +26,7 @@
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
Expand Down Expand Up @@ -114,6 +115,7 @@
import com.hedera.node.app.service.schedule.impl.handlers.ScheduleDeleteHandler;
import com.hedera.node.app.service.schedule.impl.handlers.ScheduleSignHandler;
import com.hedera.node.app.service.token.ReadableAccountStore;
import com.hedera.node.app.service.token.impl.WritableAccountStore;
import com.hedera.node.app.service.token.impl.WritableTokenRelationStore;
import com.hedera.node.app.service.token.impl.WritableTokenStore;
import com.hedera.node.app.service.token.impl.handlers.CryptoAddLiveHashHandler;
Expand All @@ -139,9 +141,11 @@
import com.hedera.node.app.service.token.impl.handlers.TokenUnfreezeAccountHandler;
import com.hedera.node.app.service.token.impl.handlers.TokenUnpauseHandler;
import com.hedera.node.app.service.token.impl.handlers.TokenUpdateHandler;
import com.hedera.node.app.service.token.impl.records.CreateAccountRecordBuilder;
import com.hedera.node.app.service.util.impl.handlers.UtilPrngHandler;
import com.hedera.node.app.spi.meta.HandleContext;
import com.hedera.node.app.spi.state.ReadableStates;
import com.hedera.node.app.spi.workflows.HandleException;
import com.hedera.node.app.spi.workflows.PreCheckException;
import com.hedera.node.app.spi.workflows.TransactionHandler;
import com.hedera.node.app.state.HederaState;
Expand Down Expand Up @@ -311,14 +315,17 @@ class MonoTransactionDispatcherTest {
private GlobalDynamicProperties dynamicProperties;

@Mock
private WritableStoreFactory writableStoreFactory;
private WorkingStateWritableStoreFactory writableStoreFactory;

@Mock
private WritableTopicStore writableTopicStore;

@Mock
private WritableTokenStore writableTokenStore;

@Mock
private WritableAccountStore writableAccountStore;

@Mock
private WritableTokenRelationStore writableTokenRelStore;

Expand Down Expand Up @@ -569,6 +576,41 @@ void dispatchesTokenUnpauseAsExpected() {
verify(writableTokenStore).commit();
}

@Test
void dispatchesCryptoCreateAsExpected() {
final var createBuilder = mock(CreateAccountRecordBuilder.class);

given(cryptoCreateHandler.newRecordBuilder()).willReturn(createBuilder);
given(createBuilder.getCreatedAccount()).willReturn(666L);
given(writableStoreFactory.createAccountStore()).willReturn(writableAccountStore);
given(usageLimits.areCreatableAccounts(1)).willReturn(true);

dispatcher.dispatchHandle(HederaFunctionality.CRYPTO_CREATE, transactionBody, writableStoreFactory);

verify(txnCtx)
.setCreated(PbjConverter.fromPbj(
AccountID.newBuilder().accountNum(666L).build()));
verify(writableAccountStore).commit();
}

@Test
void doesntCommitWhenUsageLimitsExceeded() {
final var createBuilder = mock(CreateAccountRecordBuilder.class);

given(cryptoCreateHandler.newRecordBuilder()).willReturn(createBuilder);
given(writableStoreFactory.createAccountStore()).willReturn(writableAccountStore);
given(usageLimits.areCreatableAccounts(1)).willReturn(false);

assertThatThrownBy(() -> dispatcher.dispatchHandle(
HederaFunctionality.CRYPTO_CREATE, transactionBody, writableStoreFactory))
.isInstanceOf(HandleException.class);

verify(txnCtx, never())
.setCreated(PbjConverter.fromPbj(
AccountID.newBuilder().accountNum(666L).build()));
verify(writableAccountStore, never()).commit();
}

@Test
void cannotDispatchUnsupportedOperations() {
assertThatThrownBy(() -> dispatcher.dispatchHandle(
Expand Down
Expand Up @@ -21,6 +21,7 @@
import static org.mockito.BDDMockito.given;

import com.hedera.node.app.service.consensus.ConsensusService;
import com.hedera.node.app.service.token.TokenService;
import com.hedera.node.app.spi.state.WritableStates;
import com.hedera.node.app.state.HederaState;
import com.hedera.node.app.state.WorkingStateAccessor;
Expand Down Expand Up @@ -64,24 +65,32 @@ void createsWritableStore() {
@Test
void returnsTopicStore() {
workingStateAccessor.setHederaState(state);
given(state.createWritableStates("ConsensusService")).willReturn(writableStates);
given(state.createWritableStates(ConsensusService.NAME)).willReturn(writableStates);
final var store = subject.createTopicStore();
assertNotNull(store);
}

@Test
void returnsTokenStore() {
workingStateAccessor.setHederaState(state);
given(state.createWritableStates("TokenService")).willReturn(writableStates);
given(state.createWritableStates(TokenService.NAME)).willReturn(writableStates);
final var store = subject.createTokenStore();
assertNotNull(store);
}

@Test
void returnsTokenRelStore() {
workingStateAccessor.setHederaState(state);
given(state.createWritableStates("TokenService")).willReturn(writableStates);
given(state.createWritableStates(TokenService.NAME)).willReturn(writableStates);
final var store = subject.createTokenRelStore();
assertNotNull(store);
}

@Test
void returnsAccountStore() {
workingStateAccessor.setHederaState(state);
given(state.createWritableStates(TokenService.NAME)).willReturn(writableStates);
final var store = subject.createAccountStore();
assertNotNull(store);
}
}
Expand Up @@ -69,9 +69,9 @@
import com.hedera.hapi.node.base.AccountID;
import com.hedera.hapi.node.base.Key;
import com.hedera.hapi.node.state.token.Account;
import com.hedera.hapi.node.state.token.AccountApprovalForAllAllowance;
import com.hedera.hapi.node.state.token.AccountCryptoAllowance;
import com.hedera.hapi.node.state.token.AccountFungibleTokenAllowance;
import com.hedera.hapi.node.state.token.AccountTokenAllowance;
import com.hedera.node.app.service.mono.state.virtual.EntityNumValue;
import com.hedera.node.app.service.mono.state.virtual.EntityNumVirtualKey;
import com.hedera.node.app.service.token.ReadableAccountStore;
Expand Down Expand Up @@ -142,21 +142,19 @@ class SigReqAdapterUtils {
private static final String ACCOUNTS_KEY = "ACCOUNTS";

private static AccountCryptoAllowance cryptoAllowances = AccountCryptoAllowance.newBuilder()
.accountNum(DEFAULT_PAYER.getAccountNum())
.spenderNum(DEFAULT_PAYER.getAccountNum())
.amount(500L)
.build();
private static AccountFungibleTokenAllowance fungibleTokenAllowances =
AccountFungibleTokenAllowance.newBuilder()
.tokenAllowanceKey(AccountTokenAllowance.newBuilder()
.tokenNum(KNOWN_TOKEN_NO_SPECIAL_KEYS.getTokenNum())
.accountNum(DEFAULT_PAYER.getAccountNum())
.build())
.tokenNum(KNOWN_TOKEN_NO_SPECIAL_KEYS.getTokenNum())
.spenderNum(DEFAULT_PAYER.getAccountNum())
.amount(10_000L)
.build();

private static AccountTokenAllowance nftAllowances = AccountTokenAllowance.newBuilder()
private static AccountApprovalForAllAllowance nftAllowances = AccountApprovalForAllAllowance.newBuilder()
.tokenNum(KNOWN_TOKEN_WITH_WIPE.getTokenNum())
.accountNum(DEFAULT_PAYER.getAccountNum())
.spenderNum(DEFAULT_PAYER.getAccountNum())
.build();

private static ReadableKVState<EntityNumVirtualKey, Account> wellKnownAccountsState() {
Expand Down Expand Up @@ -261,7 +259,7 @@ private static Account toPbjAccount(
boolean receiverSigRequired,
List<AccountCryptoAllowance> cryptoAllowances,
List<AccountFungibleTokenAllowance> fungibleTokenAllowances,
List<AccountTokenAllowance> nftTokenAllowances) {
List<AccountApprovalForAllAllowance> nftTokenAllowances) {
return new Account(
number,
Bytes.EMPTY,
Expand Down Expand Up @@ -293,7 +291,8 @@ private static Account toPbjAccount(
nftTokenAllowances,
fungibleTokenAllowances,
2,
false);
false,
null);
}
}
}
Expand Up @@ -74,9 +74,9 @@
import com.hedera.hapi.node.base.Key;
import com.hedera.hapi.node.base.ScheduleID;
import com.hedera.hapi.node.state.token.Account;
import com.hedera.hapi.node.state.token.AccountApprovalForAllAllowance;
import com.hedera.hapi.node.state.token.AccountCryptoAllowance;
import com.hedera.hapi.node.state.token.AccountFungibleTokenAllowance;
import com.hedera.hapi.node.state.token.AccountTokenAllowance;
import com.hedera.hapi.node.transaction.TransactionBody;
import com.hedera.node.app.service.mono.pbj.PbjConverter;
import com.hedera.node.app.service.mono.state.virtual.EntityNumVirtualKey;
Expand Down Expand Up @@ -210,21 +210,19 @@ public class SigReqAdapterUtils {
private static final String ACCOUNTS_KEY = "ACCOUNTS";

private static AccountCryptoAllowance cryptoAllowances = AccountCryptoAllowance.newBuilder()
.accountNum(DEFAULT_PAYER.getAccountNum())
.spenderNum(DEFAULT_PAYER.getAccountNum())
Neeharika-Sompalli marked this conversation as resolved.
Show resolved Hide resolved
.amount(500L)
.build();
private static AccountFungibleTokenAllowance fungibleTokenAllowances =
AccountFungibleTokenAllowance.newBuilder()
.tokenAllowanceKey(AccountTokenAllowance.newBuilder()
.tokenNum(KNOWN_TOKEN_NO_SPECIAL_KEYS.getTokenNum())
.accountNum(DEFAULT_PAYER.getAccountNum())
.build())
.tokenNum(KNOWN_TOKEN_NO_SPECIAL_KEYS.getTokenNum())
.spenderNum(DEFAULT_PAYER.getAccountNum())
.amount(10_000L)
.build();

private static AccountTokenAllowance nftAllowances = AccountTokenAllowance.newBuilder()
private static AccountApprovalForAllAllowance nftAllowances = AccountApprovalForAllAllowance.newBuilder()
.tokenNum(KNOWN_TOKEN_WITH_WIPE.getTokenNum())
.accountNum(DEFAULT_PAYER.getAccountNum())
.spenderNum(DEFAULT_PAYER.getAccountNum())
.build();

public static Map<EntityNumVirtualKey, Account> wellKnownAccountStoreAt() {
Expand Down Expand Up @@ -325,7 +323,7 @@ private static Account toPbjAccount(
boolean receiverSigRequired,
List<AccountCryptoAllowance> cryptoAllowances,
List<AccountFungibleTokenAllowance> fungibleTokenAllowances,
List<AccountTokenAllowance> nftTokenAllowances) {
List<AccountApprovalForAllAllowance> nftTokenAllowances) {
return new Account(
number,
Bytes.EMPTY,
Expand Down Expand Up @@ -357,7 +355,8 @@ private static Account toPbjAccount(
nftTokenAllowances,
fungibleTokenAllowances,
2,
false);
false,
null);
}
}
}