{"_id":"@corndao/near-multi-tx","name":"@corndao/near-multi-tx","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@corndao/near-multi-tx","version":"0.1.0","license":"MIT License","description":"Make the construction of the transaction easier on NEAR blockchain.","main":"dist/index.js","typings":"dist/index.d.ts","scripts":{"build":"rm -rf dist && tsup src --minify --dts","lint":"eslint src/**/*.ts --fix","prepare":"husky install","np":"yarn build && npx np --no-tests"},"dependencies":{"@near-wallet-selector/core":"^7.9.0","big.js":"^6.2.1","buffer":"^6.0.3","near-api-js":"^1.1.0"},"devDependencies":{"@types/big.js":"^6.1.6","@typescript-eslint/eslint-plugin":"^5.38.0","@typescript-eslint/parser":"^5.38.0","eslint":"^8.23.1","husky":"^8.0.2","lint-staged":"^13.0.4","prettier":"^2.8.1","tsup":"^6.5.0","typescript":"^4.5.5"},"prettier":{"semi":true,"singleQuote":true,"printWidth":120},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"licenseText":"MIT License\n\nCopyright (c) 2023 NameSky\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","_id":"@corndao/near-multi-tx@0.1.0","dist":{"shasum":"4a867b8b2a0ebae84989c62e14f5d4a32bfa93da","integrity":"sha512-8xBOYTE1TCJnyTocuRuYJpZ+vgtJP779Ltu7KkXC8EEgyfbu/UaODidImZqrc6CC8VPw/IvAe1+i2vyQrHfhXA==","tarball":"https://registry.npmjs.org/@corndao/near-multi-tx/-/near-multi-tx-0.1.0.tgz","fileCount":102,"unpackedSize":156066,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDRqPaBEaoIXKRjPTlwBf+D9XKzPp78c038y/ibJZUXQIgM1TB8HdsAFI/jyKRFLNUJrfYUydb/PQ35ePdRCvdo1k="}]},"_npmUser":{"name":"cornerstoner","email":"cornerstoner@163.com"},"directories":{},"maintainers":[{"name":"cornerstoner","email":"cornerstoner@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/near-multi-tx_0.1.0_1684925683314_0.3925596352795866"},"_hasShrinkwrap":false}},"time":{"created":"2023-05-24T10:54:43.226Z","0.1.0":"2023-05-24T10:54:43.521Z","modified":"2023-05-24T10:54:43.723Z"},"maintainers":[{"name":"cornerstoner","email":"cornerstoner@163.com"}],"description":"Make the construction of the transaction easier on NEAR blockchain.","license":"MIT License","readme":"# Multi Transaction\nMake the construction of the transaction easier on [NEAR](https://near.org) blockchain\n\nSupport [near-api-js](https://github.com/near/near-api-js) and [wallet-selector](https://github.com/near/wallet-selector)\n\n## Dependencies\n```json\n{\n  \"near-api-js\": \"^1.1.0\",\n  \"@near-wallet-selector/core\": \"^7.9.0\"\n}\n```\n\n## Install\n```shell\nyarn add multi-transaction\n```\n\n## Usage\nThis package contains `MultiTransaction`, `MultiSendAccount`, `MultiSendWalletSelector` and other helpful utils.\n\n### Backend\n```typescript\nimport { MultiTransaction, MultiSendAccount, Amount, Gas } from \"multi-transaction\";\n```\n\n#### Call view function\nCall view function on backend\n\n```typescript\nasync function exampleCallViewFunction(near: Near) {\n  const account = new MultiSendAccount(near.connection);\n  \n  const amount: string = await account.view({\n    contractId: 'wrap.near',\n    methodName: 'ft_balance_of',\n    args: {\n      account_id: 'alice.near'\n    }\n  });\n  \n  console.log(`Balance: ${ Amount.formatYoctoNear(amount) } NEAR`);\n}\n```\n\n#### Call change function\nCall change function on backend\n\n```typescript\nasync function exampleCallChangeFunction(near: Near) {\n  const account = new MultiSendAccount(near.connection, 'alice.near');\n  \n  const multiTransaction = MultiTransaction\n    .createTransaction('wrap.near')\n    .functionCall({\n      methodName: 'ft_transfer',\n      args: {\n        receiver_id: 'bob.near',\n        amount: Amount.parseYoctoNear('8.88')\n      },\n      attachedDeposit: Amount.ONE_YOCTO,\n      gas: Gas.tera(10)\n    });\n  \n  await account.send(multiTransaction);\n}\n```\n\n### Frontend\n```tsx\nimport { setupMultiSendWalletSelector, Amount, Gas } from \"multi-transaction\";\n\n// Example Hook\nconst useWalletSelector = () => {\n  const [selector, setSelector] = useState();\n  \n  useEffect(() => {\n    if (selector) {\n      return;\n    }\n    setupMultiSendWalletSelector({\n      network: 'mainnet',\n      modules: [\n        /* wallet modules */\n      ]\n    }).then(setSelector);\n  }, []);\n  \n  return { selector };\n}\n```\n#### Call view function\nCall view function on frontend\n```tsx\nconst ExampleCallViewFunction = () => {\n  const { selector } = useWalletSelector();\n  \n  const viewWnearBalance = async () => {\n    const amount: string = selector!.view({\n      contractId: 'wrap.near',\n      methodName: 'ft_balance_of',\n      args: {\n        account_id: 'alice.near'\n      }\n    });\n    \n    console.log(`Balance: ${ Amount.formatYoctoNear(amount) } NEAR`);\n  };\n  \n  return (\n    <button onclick={viewWnearBalance}>\n      View Alice's wNEAR balance\n    </button>\n  );\n}\n```\n\n#### Call change function\nCall change function on frontend\n\n```tsx\nconst ExampleCallChangeFunction = () => {\n  const { selector } = useWalletSelector();\n  \n  const sendWnear = async () => {\n    const multiTransaction = MultiTransaction\n      .createTransaction('wrap.near')\n      .ft_transfer({\n        args: {\n          receiver_id: 'bob.near',\n          amount: Amount.parseYoctoNear(8.88)\n        },\n        gas: Gas.tera(10)\n      });\n    await selector!.send(multiTransaction);\n  };\n  \n  return (\n    <button onclick={sendWnear}>\n      Send 8.88 wNEAR to Bob\n    </button>\n  );\n}\n```\n\n### Construct complex transactions\n`MultiTransaction` allow you to construct complex multiple transactions (not only multiple actions)\n\n```typescript\nasync function exampleConstructComplexTransactions(near: Near) {\n  const account = new MultiSendAccount(near.connection, 'alice.near');\n  \n  const multiTransaction = MultiTransaction\n    // 1st transaction for creating account\n    .createTransaction('honey.alice.near')\n    .createAccount()\n    .transfer(Amount.parseYoctoNear('0.1'))\n    .addKey('ed25519:<data>', { permission: 'FullAccess' })\n    // 2nd transaction for sending USDT.e\n    .appendTransaction('dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near')\n    .storage_deposit({\n      args: {\n        account_id: 'honey.alice.near'\n      },\n      attachedDeposit: Amount.parseYoctoNear('0.0125'),\n    })\n    .ft_transfer({\n      args: {\n        receiver_id: 'honey.alice.near',\n        amount: Amount.parse(888, 6).toFixed(),\n        memo: 'Happy Birthday'\n      },\n    });\n  \n  await account.send(multiTransaction);\n}\n```\n\n### Manual Convert Transactions\nMaybe you don't want to use `MultiSendAccount` or `MultiSendWalletSelector`, you can convert transactions manually\n\n```typescript\nimport { MultiTransaction, parseNearApiJsTransactions, parseNearWalletSelectorTransactions } from \"multi-transaction\";\n\n// Backend\nasync function exampleManualConvertToNearApiJsTransactions(near: Near, multiTransaction: MultiTransaction) {\n  const account = await near.account('alice.near');\n  const transactions = parseNearApiJsTransactions(multiTransaction);\n\n  for (const transaction of transactions) {\n    // Won't call as `account.signAndSendTransaction` because it is a protected method.\n    await account['signAndSendTransaction'](transaction);\n  }\n}\n\n// Frontend\nasync function exampleManualConvertToNearWalletSelectorTransactions(selector: WalletSelector, multiTransaction: MultiTransaction) {\n  const wallet = await selector.wallet();\n  const transactions = parseNearWalletSelectorTransactions(multiTransaction);\n\n  if (transactions.length === 1) {\n    // `signAndSendTransactions` doesn't use login key, so if transaction is not multiple, we suggest to use \n    // `signAndSendTransaction` instead.\n    await wallet.signAndSendTransaction(transactions[0]);\n  } else {\n    await wallet.signAndSendTransactions({ transactions });\n  }\n}\n```\n","readmeFilename":"README.md"}