Skip to content

Commit

Permalink
feat: storage management contract standards functions
Browse files Browse the repository at this point in the history
  • Loading branch information
mpeterdev committed Sep 23, 2024
1 parent 3dc94de commit 5ca1461
Show file tree
Hide file tree
Showing 7 changed files with 1,395 additions and 27 deletions.
4 changes: 3 additions & 1 deletion packages/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
"@near-js/utils": "workspace:*",
"@noble/hashes": "1.3.3",
"isomorphic-fetch": "3.0.0",
"near-ledger-js": "0.2.1"
"near-contract-standards": "^2.0.0",
"near-ledger-js": "0.2.1",
"near-sdk-js": "^2.0.0"
},
"keywords": [],
"author": "",
Expand Down
1 change: 1 addition & 0 deletions packages/client/src/contract-standards/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './storage-management';
97 changes: 97 additions & 0 deletions packages/client/src/contract-standards/storage-management.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/**
* Tailored functionCall invocations for StorageManagement contract standard
*/

import { functionCall } from '../transactions/actions';
import type { StorageBalance, StorageManagement } from 'near-contract-standards/lib';
import type { FunctionCallParams, /*ViewParams */ } from '../interfaces';
import type { FinalExecutionOutcome } from '@near-js/types';
// import { view } from '../view';

// import type { StorageManagement, StorageBalance, StorageBalanceBounds } from 'near-contract-standards/lib/storage_management';
// import { AccountId } from 'near-sdk-js';
// import { Option } from 'near-contract-standards/lib/non_fungible_token/utils';

type StorageManagementParams<T extends keyof StorageManagement> = Omit<FunctionCallParams, 'method' | 'args'> & {
args: Parameters<StorageManagement[T]>[0]
};

// type StorageManagementViewParams<T extends keyof StorageManagement> = Omit<ViewParams, 'method' | 'args'> & {
// args: Parameters<StorageManagement[T]>[0]
// };

type StorageManagementReturn<T extends keyof StorageManagement> = {
outcome: FinalExecutionOutcome;
result: ReturnType<StorageManagement[T]>;
};

export async function storageDeposit(
params: StorageManagementParams<'storage_deposit'>
): Promise<StorageManagementReturn<'storage_deposit'>> {
const {outcome,result} = await functionCall({
...params,
method: 'storage_deposit'
});


// Ensure the result matches the StorageBalance structure
if (typeof result === 'object' && typeof result?.['total'] === 'string' && typeof result?.['available'] === 'string') {
const storageBalance = result as StorageBalance;

// cast string bigints to bigint literals
Object.assign(storageBalance, {
total: BigInt(storageBalance.total),
available: BigInt(storageBalance.available)
});

return {
outcome,
result: storageBalance
}
}

throw new Error('Unexpected result format from storage_deposit');
}

// export async function storageWithdraw(
// params: StorageManagementParams<'storage_withdraw'>
// ): Promise<StorageManagementReturn<'storage_withdraw'>> {
// return functionCall({
// ...params,
// method: 'storage_withdraw'
// });
// }

export async function storageUnregister(
params: StorageManagementParams<'storage_unregister'>
): Promise<StorageManagementReturn<'storage_unregister'>> {
const {outcome,result} = await functionCall({
...params,
method: 'storage_unregister'
});

console.log(result);
console.log('type', typeof result);
return {
outcome,
result: Boolean(result)
}
}

// export async function storageBalanceBounds(
// params: StorageManagementViewParams<'storage_balance_bounds'>
// ): Promise<StorageManagementReturn<'storage_balance_bounds'>> {
// return view({
// ...params,
// method: 'storage_balance_bounds',
// });
// }

// export async function storageBalanceOf(
// params: StorageManagementViewParams<'storage_balance_of'>
// ): Promise<StorageManagementReturn<'storage_balance_of'>> {
// return view({
// ...params,
// method: 'storage_balance_of'
// });
// }
1 change: 1 addition & 0 deletions packages/client/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ export * from './providers';
export * from './signing';
export * from './transactions';
export * from './view';
export * from './contract-standards';
93 changes: 93 additions & 0 deletions packages/cookbook/contract-standards/storage-management.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import {
createFundedTestnetAccount,
generateRandomKeyPair,
getPlaintextFilesystemSigner,
getTestnetRpcProvider,
storageDeposit,
storageUnregister,
} from '@near-js/client';
import chalk from 'chalk';
import { join } from 'node:path';
import { homedir } from 'node:os';

export default async function storageManagementStandard(contractAddress: string, accountId: string) {
// run serially since calls may rely on previous calls
await storageDepositCall(contractAddress, accountId);
await storageUnregisterCall(contractAddress, accountId);
}

export async function storageDepositCall(contractAddress: string, accountId: string) {
if (!contractAddress || !accountId) {
console.log(chalk`{red pnpm storageManagementStorageDeposit -- CONTRACT_ADDRESS ACCOUNT_ID}`);
return;
}

const credentialsPath = join(homedir(), '.near-credentials');

// initialize testnet RPC provider
const rpcProvider = getTestnetRpcProvider();
// initialize the transaction signer using a pre-existing key for `accountId`
const { signer } = getPlaintextFilesystemSigner({ account: accountId, network: 'testnet', filepath: credentialsPath });

const {result} = await storageDeposit({
receiver: contractAddress,
sender: accountId,
args: {
account_id: accountId,
registration_only: false,
},
deps: {
rpcProvider,
signer,
},
deposit: 1000000000000000000000000n,
});

const output = chalk`
{white ------------------------------------------------------------------------ }
{bold.green RESULTS} {white storage_deposit}
{white ------------------------------------------------------------------------ }
{bold.white Total} {white |} {bold.yellow ${result.total}}
{bold.white Available} {white |} {bold.yellow ${result.available}}
{white ------------------------------------------------------------------------ }
`;
console.log(output);
}

export async function storageUnregisterCall(contractAddress: string, accountId: string) {
if (!contractAddress || !accountId) {
console.log(chalk`{red pnpm storageManagementStorageDeposit -- CONTRACT_ADDRESS ACCOUNT_ID}`);
return;
}

const credentialsPath = join(homedir(), '.near-credentials');

// initialize testnet RPC provider
const rpcProvider = getTestnetRpcProvider();
// initialize the transaction signer using a pre-existing key for `accountId`
const { signer } = getPlaintextFilesystemSigner({ account: accountId, network: 'testnet', filepath: credentialsPath });

const {result} = await storageUnregister({
receiver: contractAddress,
sender: accountId,
args: {
force: true,
},
deps: {
rpcProvider,
signer,
},
deposit: 1n,
});
console.log(`unregister result: ${result}`);
console.log(`unregister result type: ${typeof result}`);

const output = chalk`
{white ------------------------------------------------------------------------ }
{bold.green RESULTS} {white storage_unregister}
{white ------------------------------------------------------------------------ }
{bold.white Result} {white |} {bold.yellow ${result}}
{white ------------------------------------------------------------------------ }
`;
console.log(output);
}
2 changes: 2 additions & 0 deletions packages/cookbook/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"metaTransaction": "tsx -e \"import f from './transactions/meta-transaction.ts'; f(...process.argv.slice(1));\"",
"metaTransactionRelayer": "tsx -e \"import f from './transactions/meta-transaction-relayer.ts'; f(...process.argv.slice(1));\"",
"signWithLedger": "tsx -e \"import f from './utils/ledger-signing.ts'; f(...process.argv.slice(1));\"",
"storageManagementStandard": "tsx -e \"import f from './contract-standards/storage-management.ts'; f(...process.argv.slice(1));\"",
"traverseBlocks": "tsx -e \"import f from './transactions/traverse-blocks.ts'; f(...process.argv.slice(1));\"",
"unwrapNear": "tsx -e \"import f from './utils/unwrap-near.ts'; f(...process.argv.slice(1));\"",
"verifySignature": "tsx -e \"import f from './utils/verify-signature.ts'; f(...process.argv.slice(1));\"",
Expand All @@ -42,6 +43,7 @@
"near-api-js": "workspace:*",
"ts-node": "^10.9.2",
"tsconfig": "workspace:*",
"tsx": "^4.19.1",
"typescript": "5.4.5"
}
}
Loading

0 comments on commit 5ca1461

Please sign in to comment.