diff --git a/CHANGELOG.md b/CHANGELOG.md index c67a134..32ca72b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ +### [0.13.0](https://github.com/useElven/core/releases/tag/v0.13.0) (2023-12-03) +- add useScDeploy hook for smart contract deployments - check [docs](https://www.useElven.com/docs/sdk-reference.html#usescdeploy()) for more informations + ### [0.12.0](https://github.com/useElven/core/releases/tag/v0.12.0) (2023-11-30) -- add useSignMessage hook - check [docs](https://www.useElven.com) for more informations +- add useSignMessage hook - check [docs](https://www.useElven.com/docs/sdk-reference.html#usesignmessage()) for more informations - min Node version is 18 - update dependencies diff --git a/package-lock.json b/package-lock.json index 02c2c53..2c3f343 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@useelven/core", - "version": "0.12.0", + "version": "0.13.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@useelven/core", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "dependencies": { "@multiversx/sdk-core": "12.15.0", @@ -22,12 +22,12 @@ }, "devDependencies": { "@types/lodash.clonedeep": "4.5.9", - "@types/node": "20.10.1", - "@types/react": "18.2.39", + "@types/node": "20.10.2", + "@types/react": "18.2.41", "@typescript-eslint/eslint-plugin": "6.13.1", "@typescript-eslint/parser": "6.13.1", - "eslint": "8.54.0", - "eslint-config-prettier": "9.0.0", + "eslint": "8.55.0", + "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.0.1", "eslint-plugin-react": "7.33.2", "eslint-plugin-react-hooks": "4.6.0", @@ -429,9 +429,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -452,9 +452,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1543,9 +1543,9 @@ } }, "node_modules/@types/node": { - "version": "20.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", - "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", + "version": "20.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.2.tgz", + "integrity": "sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==", "dependencies": { "undici-types": "~5.26.4" } @@ -1557,9 +1557,9 @@ "devOptional": true }, "node_modules/@types/react": { - "version": "18.2.39", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.39.tgz", - "integrity": "sha512-Oiw+ppED6IremMInLV4HXGbfbG6GyziY3kqAwJYOR0PNbkYDmLWQA3a95EhdSmamsvbkJN96ZNN+YD+fGjzSBA==", + "version": "18.2.41", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.41.tgz", + "integrity": "sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw==", "devOptional": true, "dependencies": { "@types/prop-types": "*", @@ -3076,15 +3076,15 @@ } }, "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3131,9 +3131,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" diff --git a/package.json b/package.json index ba452da..ad79c1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@useelven/core", - "version": "0.12.0", + "version": "0.13.0", "description": "Core React hooks for MultiversX DApps", "license": "MIT", "author": "Julian Ćwirko <julian.io>", @@ -78,12 +78,12 @@ }, "devDependencies": { "@types/lodash.clonedeep": "4.5.9", - "@types/node": "20.10.1", - "@types/react": "18.2.39", + "@types/node": "20.10.2", + "@types/react": "18.2.41", "@typescript-eslint/eslint-plugin": "6.13.1", "@typescript-eslint/parser": "6.13.1", - "eslint": "8.54.0", - "eslint-config-prettier": "9.0.0", + "eslint": "8.55.0", + "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.0.1", "eslint-plugin-react": "7.33.2", "eslint-plugin-react-hooks": "4.6.0", diff --git a/src/hooks/useScDeploy.tsx b/src/hooks/useScDeploy.tsx new file mode 100644 index 0000000..23323fd --- /dev/null +++ b/src/hooks/useScDeploy.tsx @@ -0,0 +1,91 @@ +import { + Address, + Code, + SmartContract, + CodeMetadata, + TypedValue, +} from '@multiversx/sdk-core'; +import { useTransaction, TransactionArgs } from './useTransaction'; +import { useAccount } from './useAccount'; +import { useConfig } from './useConfig'; +import { errorParse } from '../utils/errorParse'; +import { useState } from 'react'; + +export interface ScDeployHookProps { + webWalletRedirectUrl?: TransactionArgs['webWalletRedirectUrl']; + cb?: TransactionArgs['cb']; +} + +export interface ScDeployArgs { + source: Buffer | string; + gasLimit?: number; + codeMetadata?: [boolean, boolean, boolean, boolean]; + initArguments?: TypedValue[]; +} + +export const useScDeploy = ( + { webWalletRedirectUrl, cb }: ScDeployHookProps = { + webWalletRedirectUrl: undefined, + cb: undefined, + } +) => { + const [scAddress, setScAddress] = useState<string>(); + const { address: accountAddress, nonce } = useAccount(); + const { shortId } = useConfig(); + + const { triggerTx, pending, transaction, txResult, error } = useTransaction({ + webWalletRedirectUrl, + cb, + }); + + const deploy = async ({ + source, + gasLimit = 10_000_000, + codeMetadata = [true, false, false, false], + initArguments = [], + }: ScDeployArgs) => { + try { + let code: Code; + + if (Buffer.isBuffer(source)) { + code = Code.fromBuffer(source); + } else { + const response = await fetch(source); + const bytes = await response.arrayBuffer(); + code = Code.fromBuffer(Buffer.from(bytes)); + } + + const smartContract = new SmartContract(); + const tx = smartContract.deploy({ + deployer: new Address(accountAddress), + code, + codeMetadata: new CodeMetadata(...codeMetadata), + initArguments, + gasLimit, + chainID: shortId || 'D', + }); + + setScAddress( + SmartContract.computeAddress( + new Address(accountAddress), + nonce + ).bech32() + ); + + tx.setNonce(nonce); + + triggerTx({ tx }); + } catch (e) { + throw new Error(errorParse(e)); + } + }; + + return { + deploy, + pending, + transaction, + txResult, + scAddress, + error, + }; +}; diff --git a/src/index.tsx b/src/index.tsx index 45a0fa6..722cea8 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -16,6 +16,7 @@ export * from './hooks/useNetwork'; export * from './hooks/useTokenTransfer'; export * from './hooks/useMultiTokenTransfer'; export * from './hooks/useSignMessage'; +export * from './hooks/useScDeploy'; export { useApiCall } from './hooks/useApiCall'; export { useScQuery } from './hooks/useScQuery';