Skip to content

Commit

Permalink
[PLA-1340] Support PermittedExtrinsics fuel tank rule. (#18)
Browse files Browse the repository at this point in the history
  • Loading branch information
v16Studios authored Nov 6, 2023
1 parent b227c4b commit 38b671b
Show file tree
Hide file tree
Showing 45 changed files with 1,008 additions and 861 deletions.
1 change: 1 addition & 0 deletions lang/en/input_type.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@
'dispatch.description' => 'The dispatch call.',
'dispatch.field.query' => "The GraphQL query. It's required to query the 'id' and 'encodedData' from the result.",
'dispatch.field.variables' => 'The GraphQL query variables.',
'permitted_extrinsics.description' => 'The list of permitted extrinsics in this ruleset.',
];
1 change: 1 addition & 0 deletions src/Enums/DispatchCall.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ enum DispatchCall: string

case MULTI_TOKENS = '';
case FUEL_TANKS = 'fuel-tanks';
case MARKETPLACE = 'marketplace';
}
5 changes: 4 additions & 1 deletion src/Enums/DispatchRule.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Enjin\Platform\FuelTanks\Models\Substrate\FuelTankRules;
use Enjin\Platform\FuelTanks\Models\Substrate\MaxFuelBurnPerTransactionParams;
use Enjin\Platform\FuelTanks\Models\Substrate\PermittedExtrinsicsParams;
use Enjin\Platform\FuelTanks\Models\Substrate\RequireTokenParams;
use Enjin\Platform\FuelTanks\Models\Substrate\TankFuelBudgetParams;
use Enjin\Platform\FuelTanks\Models\Substrate\UserFuelBudgetParams;
Expand All @@ -21,6 +22,7 @@ enum DispatchRule: string
case USER_FUEL_BUDGET = 'UserFuelBudget';
case TANK_FUEL_BUDGET = 'TankFuelBudget';
case REQUIRE_TOKEN = 'RequireToken';
case PERMITTED_EXTRINSICS = 'PermittedExtrinsics';

/**
* Convert enum case to FuelTankRules.
Expand All @@ -33,7 +35,8 @@ public function toKind(): FuelTankRules
self::MAX_FUEL_BURN_PER_TRANSACTION => new MaxFuelBurnPerTransactionParams(''),
self::USER_FUEL_BUDGET => new UserFuelBudgetParams('', ''),
self::TANK_FUEL_BUDGET => new TankFuelBudgetParams('', ''),
self::REQUIRE_TOKEN => new RequireTokenParams('', '')
self::REQUIRE_TOKEN => new RequireTokenParams('', ''),
self::PERMITTED_EXTRINSICS => new PermittedExtrinsicsParams()
};
}
}
4 changes: 4 additions & 0 deletions src/FuelTanksServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace Enjin\Platform\FuelTanks;

use Enjin\Platform\FuelTanks\Services\Processor\Substrate\Codec\Encoder as FuelTankEncoder;
use Enjin\Platform\Services\Processor\Substrate\Codec\Encoder as BaseEncoder;
use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;

Expand Down Expand Up @@ -31,6 +33,8 @@ public function configurePackage(Package $package): void
public function register()
{
parent::register();

BaseEncoder::setCallIndexKeys(array_merge(BaseEncoder::getCallIndexKeys(), FuelTankEncoder::getCallIndexKeys()));
}

/**
Expand Down
36 changes: 33 additions & 3 deletions src/GraphQL/Mutations/AddAccountMutation.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,20 @@
namespace Enjin\Platform\FuelTanks\GraphQL\Mutations;

use Closure;
use Enjin\BlockchainTools\HexConverter;
use Enjin\Platform\FuelTanks\Rules\AccountsNotInFuelTank;
use Enjin\Platform\FuelTanks\Rules\IsFuelTankOwner;
use Enjin\Platform\FuelTanks\Services\TransactionService;
use Enjin\Platform\GraphQL\Schemas\Primary\Substrate\Traits\StoresTransactions;
use Enjin\Platform\GraphQL\Schemas\Primary\Traits\HasTransactionDeposit;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasIdempotencyField;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasSigningAccountField;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasSimulateField;
use Enjin\Platform\Interfaces\PlatformBlockchainTransaction;
use Enjin\Platform\Models\Transaction;
use Enjin\Platform\Rules\ValidSubstrateAddress;
use Enjin\Platform\Services\Serialization\Interfaces\SerializationServiceInterface;
use Enjin\Platform\Support\Account;
use Enjin\Platform\Support\SS58Address;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use Illuminate\Support\Arr;
Expand All @@ -19,6 +26,10 @@
class AddAccountMutation extends Mutation implements PlatformBlockchainTransaction
{
use HasIdempotencyField;
use HasSigningAccountField;
use HasSimulateField;
use HasTransactionDeposit;
use StoresTransactions;

/**
* Get the mutation's attributes.
Expand Down Expand Up @@ -53,7 +64,9 @@ public function args(): array
'type' => GraphQL::type('String!'),
'description' => __('enjin-platform-fuel-tanks::mutation.add_account.args.userId'),
],
...$this->getSigningAccountField(),
...$this->getIdempotencyField(),
...$this->getSimulateField(),
];
}

Expand All @@ -66,14 +79,31 @@ public function resolve(
$context,
ResolveInfo $resolveInfo,
Closure $getSelectFields,
TransactionService $transaction
SerializationServiceInterface $serializationService
) {
$encodedData = $serializationService->encode($this->getMutationName(), static::getEncodableParams(...$args));

return Transaction::lazyLoadSelectFields(
DB::transaction(fn () => $transaction->addAccount($args)),
DB::transaction(fn () => $this->storeTransaction($args, $encodedData)),
$resolveInfo
);
}

public static function getEncodableParams(...$params): array
{
$tankId = Arr::get($params, 'tankId', Account::daemonPublicKey());
$userId = Arr::get($params, 'userId', Account::daemonPublicKey());

return [
'tankId' => [
'Id' => HexConverter::unPrefix(SS58Address::getPublicKey($tankId)),
],
'userId' => [
'Id' => HexConverter::unPrefix(SS58Address::getPublicKey($userId)),
],
];
}

/**
* Get the mutation's request validation rules.
*/
Expand Down
36 changes: 33 additions & 3 deletions src/GraphQL/Mutations/BatchAddAccountMutation.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,20 @@
namespace Enjin\Platform\FuelTanks\GraphQL\Mutations;

use Closure;
use Enjin\BlockchainTools\HexConverter;
use Enjin\Platform\FuelTanks\Rules\AccountsNotInFuelTank;
use Enjin\Platform\FuelTanks\Rules\IsFuelTankOwner;
use Enjin\Platform\FuelTanks\Services\TransactionService;
use Enjin\Platform\GraphQL\Schemas\Primary\Substrate\Traits\StoresTransactions;
use Enjin\Platform\GraphQL\Schemas\Primary\Traits\HasTransactionDeposit;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasIdempotencyField;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasSigningAccountField;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasSimulateField;
use Enjin\Platform\Interfaces\PlatformBlockchainTransaction;
use Enjin\Platform\Models\Transaction;
use Enjin\Platform\Rules\ValidSubstrateAddress;
use Enjin\Platform\Services\Serialization\Interfaces\SerializationServiceInterface;
use Enjin\Platform\Support\Account;
use Enjin\Platform\Support\SS58Address;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use Illuminate\Support\Arr;
Expand All @@ -19,6 +26,10 @@
class BatchAddAccountMutation extends Mutation implements PlatformBlockchainTransaction
{
use HasIdempotencyField;
use HasSigningAccountField;
use HasSimulateField;
use HasTransactionDeposit;
use StoresTransactions;

/**
* Get the mutation's attributes.
Expand Down Expand Up @@ -53,7 +64,9 @@ public function args(): array
'type' => GraphQL::type('[String!]!'),
'description' => __('enjin-platform-fuel-tanks::mutation.batch_add_account.args.userIds'),
],
...$this->getSigningAccountField(),
...$this->getIdempotencyField(),
...$this->getSimulateField(),
];
}

Expand All @@ -66,14 +79,31 @@ public function resolve(
$context,
ResolveInfo $resolveInfo,
Closure $getSelectFields,
TransactionService $transaction
SerializationServiceInterface $serializationService
) {
$encodedData = $serializationService->encode($this->getMutationName(), static::getEncodableParams(...$args));

return Transaction::lazyLoadSelectFields(
DB::transaction(fn () => $transaction->batchAddAccount($args)),
DB::transaction(fn () => $this->storeTransaction($args, $encodedData)),
$resolveInfo
);
}

public static function getEncodableParams(...$params): array
{
$tankId = Arr::get($params, 'tankId', Account::daemonPublicKey());
$userIds = collect(Arr::get($params, 'userIds', []));

return [
'tankId' => [
'Id' => HexConverter::unPrefix(SS58Address::getPublicKey($tankId)),
],
'userIds' => $userIds->map(fn ($userId) => [
'Id' => HexConverter::unPrefix(SS58Address::getPublicKey($userId)),
])->toArray(),
];
}

/**
* Get the mutation's request validation rules.
*/
Expand Down
36 changes: 33 additions & 3 deletions src/GraphQL/Mutations/BatchRemoveAccountMutation.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,20 @@
namespace Enjin\Platform\FuelTanks\GraphQL\Mutations;

use Closure;
use Enjin\BlockchainTools\HexConverter;
use Enjin\Platform\FuelTanks\Rules\AccountsExistsInFuelTank;
use Enjin\Platform\FuelTanks\Rules\IsFuelTankOwner;
use Enjin\Platform\FuelTanks\Services\TransactionService;
use Enjin\Platform\GraphQL\Schemas\Primary\Substrate\Traits\StoresTransactions;
use Enjin\Platform\GraphQL\Schemas\Primary\Traits\HasTransactionDeposit;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasIdempotencyField;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasSigningAccountField;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasSimulateField;
use Enjin\Platform\Interfaces\PlatformBlockchainTransaction;
use Enjin\Platform\Models\Transaction;
use Enjin\Platform\Rules\ValidSubstrateAddress;
use Enjin\Platform\Services\Serialization\Interfaces\SerializationServiceInterface;
use Enjin\Platform\Support\Account;
use Enjin\Platform\Support\SS58Address;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use Illuminate\Support\Arr;
Expand All @@ -19,6 +26,10 @@
class BatchRemoveAccountMutation extends Mutation implements PlatformBlockchainTransaction
{
use HasIdempotencyField;
use HasSigningAccountField;
use HasSimulateField;
use HasTransactionDeposit;
use StoresTransactions;

/**
* Get the mutation's attributes.
Expand Down Expand Up @@ -53,7 +64,9 @@ public function args(): array
'type' => GraphQL::type('[String!]!'),
'description' => __('enjin-platform-fuel-tanks::mutation.batch_remove_account.args.userIds'),
],
...$this->getSigningAccountField(),
...$this->getIdempotencyField(),
...$this->getSimulateField(),
];
}

Expand All @@ -66,14 +79,31 @@ public function resolve(
$context,
ResolveInfo $resolveInfo,
Closure $getSelectFields,
TransactionService $transaction
SerializationServiceInterface $serializationService
) {
$encodedData = $serializationService->encode($this->getMutationName(), static::getEncodableParams(...$args));

return Transaction::lazyLoadSelectFields(
DB::transaction(fn () => $transaction->batchRemoveAccount($args)),
DB::transaction(fn () => $this->storeTransaction($args, $encodedData)),
$resolveInfo
);
}

public static function getEncodableParams(...$params): array
{
$tankId = Arr::get($params, 'tankId', Account::daemonPublicKey());
$userIds = collect(Arr::get($params, 'userIds', []));

return [
'tankId' => [
'Id' => HexConverter::unPrefix(SS58Address::getPublicKey($tankId)),
],
'userIds' => $userIds->map(fn ($userId) => [
'Id' => HexConverter::unPrefix(SS58Address::getPublicKey($userId)),
])->toArray(),
];
}

/**
* Get the mutation's request validation rules.
*/
Expand Down
48 changes: 45 additions & 3 deletions src/GraphQL/Mutations/CreateFuelTankMutation.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,31 @@
namespace Enjin\Platform\FuelTanks\GraphQL\Mutations;

use Closure;
use Enjin\BlockchainTools\HexConverter;
use Enjin\Platform\FuelTanks\GraphQL\Traits\HasFuelTankValidationRules;
use Enjin\Platform\FuelTanks\Services\TransactionService;
use Enjin\Platform\FuelTanks\Models\Substrate\AccountRulesParams;
use Enjin\Platform\FuelTanks\Services\Blockchain\Implemetations\Substrate;
use Enjin\Platform\GraphQL\Schemas\Primary\Substrate\Traits\StoresTransactions;
use Enjin\Platform\GraphQL\Schemas\Primary\Traits\HasTransactionDeposit;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasIdempotencyField;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasSigningAccountField;
use Enjin\Platform\GraphQL\Types\Input\Substrate\Traits\HasSimulateField;
use Enjin\Platform\Interfaces\PlatformBlockchainTransaction;
use Enjin\Platform\Models\Transaction;
use Enjin\Platform\Services\Serialization\Interfaces\SerializationServiceInterface;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Rebing\GraphQL\Support\Facades\GraphQL;

class CreateFuelTankMutation extends Mutation implements PlatformBlockchainTransaction
{
use HasIdempotencyField;
use HasSigningAccountField;
use HasSimulateField;
use HasTransactionDeposit;
use StoresTransactions;
use HasFuelTankValidationRules;

/**
Expand Down Expand Up @@ -67,7 +79,9 @@ public function args(): array
'type' => GraphQL::type('[DispatchRuleInputType!]'),
'description' => __('enjin-platform-fuel-tanks::input_type.dispatch_rule.description'),
],
...$this->getSigningAccountField(),
...$this->getIdempotencyField(),
...$this->getSimulateField(),
];
}

Expand All @@ -80,14 +94,42 @@ public function resolve(
$context,
ResolveInfo $resolveInfo,
Closure $getSelectFields,
TransactionService $transaction
SerializationServiceInterface $serializationService,
Substrate $blockchainService
) {
$encodedData = $serializationService->encode($this->getMutationName(), static::getEncodableParams(
name: $args['name'],
userAccountManagement: $blockchainService->getUserAccountManagementParams($args),
dispatchRules: $blockchainService->getDispatchRulesParamsArray($args),
providesDeposit: $args['providesDeposit'],
accountRules: $blockchainService->getAccountRulesParams($args)
));

return Transaction::lazyLoadSelectFields(
DB::transaction(fn () => $transaction->createFuelTank($args)),
DB::transaction(fn () => $this->storeTransaction($args, $encodedData)),
$resolveInfo
);
}

public static function getEncodableParams(...$params): array
{
$name = Arr::get($params, 'name', '');
$userAccountManagement = Arr::get($params, 'userAccountManagement', null);
$ruleSets = collect(Arr::get($params, 'dispatchRules', []));
$providesDeposit = Arr::get($params, 'providesDeposit', false);
$accountRules = Arr::get($params, 'accountRules', new AccountRulesParams());

return [
'descriptor' => [
'name' => HexConverter::stringToHexPrefixed($name),
'userAccountManagement' => $userAccountManagement?->toEncodable(),
'ruleSets' => $ruleSets->map(fn ($ruleSet) => $ruleSet->toEncodable())->toArray(),
'providesDeposit' => $providesDeposit,
'accountRules' => $accountRules?->toEncodable(),
],
];
}

/**
* Get the mutation's request validation rules.
*/
Expand Down
Loading

0 comments on commit 38b671b

Please sign in to comment.