Skip to content

Commit

Permalink
Merge pull request #368 from secretkeylabs/mahmoud/eng-4370-ord_getin…
Browse files Browse the repository at this point in the history
…scriptions

ord_getInscriptions request support
  • Loading branch information
m-aboelenein committed Jul 4, 2024
2 parents 6723714 + 05abc3a commit aa586d8
Show file tree
Hide file tree
Showing 6 changed files with 141 additions and 15 deletions.
14 changes: 7 additions & 7 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
"@phosphor-icons/react": "^2.0.10",
"@playwright/test": "^1.43.1",
"@react-spring/web": "^9.6.1",
"@sats-connect/core": "0.0.13",
"@sats-connect/core": "0.0.14",
"@scure/btc-signer": "1.2.1",
"@secretkeylabs/xverse-core": "17.1.1",
"@stacks/connect": "7.4.1",
Expand Down
5 changes: 5 additions & 0 deletions src/common/utils/rpc/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
import handleGetBalance from './btc/getBalance';
import handleGetInfo from './getInfo';
import { makeRPCError, sendRpcResponse } from './helpers';
import handleGetInscriptions from './ordinals/getInscriptions';
import handleEtchRune from './runes/etch';
import handleGetRunesBalance from './runes/getBalance';
import handleMintRune from './runes/mint';
Expand Down Expand Up @@ -113,6 +114,10 @@ async function handleRPCRequest(message: RpcRequestMessage, port: chrome.runtime
await handleGetRunesBalance(message, port);
break;
}
case 'ord_getInscriptions': {
await handleGetInscriptions(message, port);
break;
}
case 'runes_mint': {
await handleMintRune(message as unknown as WebBtcMessage<'runes_mint'>, port);
break;
Expand Down
123 changes: 123 additions & 0 deletions src/common/utils/rpc/ordinals/getInscriptions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import { getTabIdFromPort } from '@common/utils';
import getSelectedAccount from '@common/utils/getSelectedAccount';
import { makeContext } from '@common/utils/popup';
import { makeAccountResourceId } from '@components/permissionsManager/resources';
import * as utils from '@components/permissionsManager/utils';
import { RpcErrorCode, RpcRequestMessage, getInscriptionsSchema } from '@sats-connect/core';
import { OrdinalsApi } from '@secretkeylabs/xverse-core';
import rootStore from '@stores/index';
import * as v from 'valibot';
import { handleInvalidMessage } from '../handle-invalid-message';
import { makeRPCError, makeRpcSuccessResponse, sendRpcResponse } from '../helpers';
import {
sendAccessDeniedResponseMessage,
sendInternalErrorMessage,
} from '../responseMessages/errors';

const handleGetInscriptions = async (message: RpcRequestMessage, port: chrome.runtime.Port) => {
const parseResult = v.safeParse(getInscriptionsSchema, message);

if (!parseResult.success) {
handleInvalidMessage(message, getTabIdFromPort(port), parseResult.issues);
return;
}
const { origin, tabId } = makeContext(port);
const [loadError, store] = await utils.loadPermissionsStore();

if (loadError) {
sendInternalErrorMessage({ tabId, messageId: message.id });
return;
}

if (!store) {
sendAccessDeniedResponseMessage({ tabId, messageId: message.id });
return;
}

const {
selectedAccountIndex,
selectedAccountType,
accountsList: softwareAccountsList,
ledgerAccountsList,
network,
} = rootStore.store.getState().walletState;

const existingAccount = getSelectedAccount({
selectedAccountIndex,
selectedAccountType,
softwareAccountsList,
ledgerAccountsList,
});

if (!existingAccount) {
sendRpcResponse(
tabId,
makeRPCError(message.id, {
code: RpcErrorCode.INTERNAL_ERROR,
message: 'Could not find selected account.',
}),
);
return;
}

const permission = utils.getClientPermission(
store.permissions,
origin,
makeAccountResourceId({
accountId: selectedAccountIndex,
networkType: network.type,
masterPubKey: existingAccount.masterPubKey,
}),
);

if (!permission) {
sendAccessDeniedResponseMessage({ tabId, messageId: message.id });
return;
}

if (!permission.actions.has('read')) {
sendAccessDeniedResponseMessage({ tabId, messageId: message.id });
return;
}

const ordinalsApi = new OrdinalsApi({ network: network.type });

try {
const inscriptionsList = await ordinalsApi.getInscriptions(
existingAccount.ordinalsAddress,
parseResult.output.params.offset,
parseResult.output.params.limit,
);
sendRpcResponse(
tabId,
makeRpcSuccessResponse<'ord_getInscriptions'>(message.id, {
total: inscriptionsList.total,
limit: inscriptionsList.limit,
offset: inscriptionsList.offset,
inscriptions: inscriptionsList.results.map((inscription) => ({
inscriptionId: inscription.id,
inscriptionNumber: String(inscription.number),
collectionName: inscription.collection_name ? inscription.collection_name : '',
contentType: inscription.content_type,
contentLength: String(inscription.content_length),
address: inscription.address,
output: inscription.output,
offset: Number(inscription.offset),
postage: inscription.value,
genesisTransaction: inscription.genesis_tx_id,
timestamp: inscription.genesis_timestamp,
})),
}),
);
} catch (error) {
sendRpcResponse(
tabId,
makeRPCError(message.id, {
code: RpcErrorCode.INTERNAL_ERROR,
message: (error as any).message,
}),
);
}
};

export default handleGetInscriptions;
8 changes: 3 additions & 5 deletions src/common/utils/rpc/responseMessages/wallet.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* eslint-disable import/prefer-default-export */
import { Return } from '@sats-connect/core';
import { makeRpcSuccessResponse, sendRpcResponse } from '../helpers';
import { BaseArgs } from './types';
Expand All @@ -14,14 +13,13 @@ export function sendRequestPermissionsSuccessResponseMessage({
sendRpcResponse(tabId, makeRpcSuccessResponse(messageId, result));
}

// Remove permissions
type RequestRemovePermissionsSuccessArgs = BaseArgs & {
type RenouncePermissionsSuccessArgs = BaseArgs & {
result: Return<'wallet_renouncePermissions'>;
};
export function sendRequestRemovePermissionsSuccessResponseMessage({
export function sendRenouncePermissionsSuccessResponseMessage({
tabId,
messageId,
result,
}: RequestRemovePermissionsSuccessArgs) {
}: RenouncePermissionsSuccessArgs) {
sendRpcResponse(tabId, makeRpcSuccessResponse(messageId, result));
}
4 changes: 2 additions & 2 deletions src/common/utils/rpc/wallet/renouncePermissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
sendAccessDeniedResponseMessage,
sendInternalErrorMessage,
} from '../responseMessages/errors';
import { sendRequestPermissionsSuccessResponseMessage } from '../responseMessages/wallet';
import { sendRenouncePermissionsSuccessResponseMessage } from '../responseMessages/wallet';

export const handleRenouncePermissions = async (
message: RpcRequestMessage,
Expand Down Expand Up @@ -40,7 +40,7 @@ export const handleRenouncePermissions = async (
utils.savePermissionsStore(store);
});

sendRequestPermissionsSuccessResponseMessage({
sendRenouncePermissionsSuccessResponseMessage({
tabId,
messageId: parseResult.output.id,
result: true,
Expand Down

0 comments on commit aa586d8

Please sign in to comment.