diff --git a/404.html b/404.html index 3e3b9069b..7c48583b7 100644 --- a/404.html +++ b/404.html @@ -8,13 +8,13 @@ - +
Skip to main content

404

Page not found

Sorry, we couldn’t find the page you’re looking for.
Be sure to check your URL please or let us help you.
- + \ No newline at end of file diff --git a/aboutus/brand/index.html b/aboutus/brand/index.html index 0f2aad623..e12f2742a 100644 --- a/aboutus/brand/index.html +++ b/aboutus/brand/index.html @@ -8,13 +8,13 @@ - +
Skip to main content

WELLDONE Brand Guidelines

Brand assets of WELLDONE Studio and products under it.

welldone

Table of Contents

Abstract

  • This is the Visual Asset Guide page for WELLDONE Studio and its sub-brands.
  • Use it as a reference when creating graphics related to WELLDONE Studio.

WELLDONE Studio

Guide in brief

  • WELLDONE Studio is one parent brand that encompasses the Wallet, Code for REMIX Plugin, and Addchain under it.
  • All sub-products can be referred to through this brand’s visual asset and petname, but lower-level brand/product identities cannot refer to WELLDONE Studio.

Typography

Color

Rectangle 233.png

tip
  • Light Blue (for dark BG): #6AB8FF
  • Dark Blue (for light BG): #2D6CFF

Symbol and Logo (SVG & PNG)

Usage guidelines

These are the symbols and logos that refer to WELLDONE Studio.

studio brand kit

tip
  1. The official brand symbols of WELLDONE Studio are limited to the designs on this list and may not be modified in outline/color/text, etc.
  2. Light/dark versions should be applied selectively to account for interaction with the background.
  3. The design should not appear blurry due to distracting graphics in the background or its relationship to the surrounding margins.
  4. The background should not have high saturation or complex patterns, and should be used in an environment with clear contrast in brightness and saturation.

WELLDONE Wallet

Color

Rectangle 234.png

tip
  • Point color: #00D6D6
  • Light Blue (for dark BG): #6AB8FF
  • Dark Blue (for light BG): #2D6CFF

Symbol and Logo (SVG & PNG)

Usage guidelines

These are the symbols and logos that refer to WELLDONE Wallet.

wallet brand kit

tip
  1. The official brand symbol of WELLDONE Wallet is limited to the designs in this list, and the outline/color/text, etc. cannot be modified.
  2. The product logo, which stands for WELLDONE Wallet, is separated from the WELLDONE Studio symbol and cannot be used independently.
  3. Light/dark version should be applied selectively considering the interaction with the background.
  4. The design should not appear blurred due to distracting graphics in the background or its relationship to the surrounding margins.
  5. The background should not have high saturation or complex patterns, and should be used in an environment with clear contrast in brightness and saturation.
- + \ No newline at end of file diff --git a/aboutus/contributions/index.html b/aboutus/contributions/index.html index 96f7541a2..e5af9d60a 100644 --- a/aboutus/contributions/index.html +++ b/aboutus/contributions/index.html @@ -8,13 +8,13 @@ - +
Skip to main content

WELLDONE Studio's Contributions

Below is a list of contents that WELLDONE Studio contributed to outside.

Tags

NEAR
APTOS
SUI
JUNO
COSMOS
WELLDONE Code
WELLDONE Wallet
RemixIDE
CosmWasm
Verification
Article
Video
Open Source
Education

Contributions

WELLDONE Code(1) — Remix IDE plugin for MultichainIntroducing WELLDONE Code (Remix IDE Plugin) to NEAR Protocol Medium.
NEAR
WELLDONE Code
RemixIDE
Article
WELLDONE Code(2) — Don’t trust, verify.Introducing WELLDONE Code (Verification) to NEAR Protocol Medium.
NEAR
WELLDONE Code
Article
AwesomeNEAR - WELLDONE WalletWallet for Web3 Voyagers
NEAR
WELLDONE Wallet
NEAR Wallet SelectorThis is a wallet selector modal that allows users to interact with NEAR dApps with a selection of available wallets.
NEAR
WELLDONE Wallet
Open Source
APTOS SLIP-0044 SignerCreate Account with hdpath 637
APTOS
WELLDONE Wallet
Open Source
APTOS Wallet AdapterA monorepo modular wallet adapter for Aptos applications
APTOS
WELLDONE Wallet
Open Source
NEAR Official DocsIntroduction to how to use WELLDONE Code on NEAR
NEAR
WELLDONE Code
RemixIDE
Article
APTOS Official DocsIntroduction to how to use WELLDONE Code on Aptos
APTOS
WELLDONE Code
RemixIDE
Article
Add Ed25519Keypair.fromDerivePath methodmake keypair from sui derive path (m/44'/784'/0'/0'/0')
SUI
WELLDONE Wallet
SUI Directory - WELLDONE WalletWELLDONE Wallet is an integrated, non-custodial wallet that allows you to freely manage your assets across any network.
SUI
WELLDONE Wallet
SUI Directory - WELLDONE CodeWELLDONE Code is a web-based tool with Move module deployment features and capabilities for developers to interact with deployed modules.
SUI
WELLDONE Code
SUI Developer Portal - WELLDONE CodeThis plug-in for the Remix web-based IDE features a graphical interface for developing Move modules.
SUI
WELLDONE Code
SUI Wallet StandardWELLDONE Wallet implemented Wallet Standard
SUI
WELLDONE Wallet
Open Source
Deploy & Write NEAR Smart Contracts on REMIX IDETutorial video about how to deploy & write NEAR Smart Contracts on REMIX IDE
NEAR
WELLDONE Code
RemixIDE
Video
JUNO Ecosystem - WELLDONE CodeWELLDONE Code is a Remix IDE plugin to deploy and execute CosmWasm smart contracts
JUNO
WELLDONE Code
Awesome-CosmWasm: WELLDONE CodeRemix IDE plugin that supports CosmWasm.
COSMOS
WELLDONE Code
CosmWasm
DSRV Labs | Remix IDE Plugin for Sui | Sui Builder House Hong KongIntroduction video about WELLDONE Code, the Remix IDE Plugin for SUI
SUI
WELLDONE Code
RemixIDE
Video
Instant Coding with Remix IDE and WELLDONE CodeThe browser-based Remix IDE, combined with the WELLDONE Code plug-in, lets you build Sui apps with no local setup or installations.
SUI
WELLDONE Code
RemixIDE
AIP-X Code Verification APIThis API proposal seeks to introduce a standard protocol for the verification of Aptos Move smart contract code.
APTOS
WELLDONE Code
Verification
SIP-3: Code Verification APIA standard protocol for the verification of SUI Move smart contract code.
SUI
WELLDONE Code
Verification
SIP-4: Dependency Update Check API standard protocol for the API that checks the latest version of a dependency.
SUI
WELLDONE Code
Verification
Universal Serializer: Decentralize Your Multichain Game on #BOS w/ DSRV labsHyunsun Yoo from the DSRV labs and Welldone wallet team show a product demo on decentralizing your game with BOS.
NEAR
WELLDONE Code
RemixIDE
Video
웰던 스튜디오의 Sui 파헤치기Sui(수이)는 유저와 개발자 모두에게 친화적인 레이어1 네트워크입니다. 빠른 속도와 적은 거래비용을 통해서 광범위한 사용성을 지향하고 있습니다. 웰던스튜디오는 Sui의 공식적인 교육 파트너로서 해당 네트워크를 통한 개발과 사용의 구체적인 과정을 안내해 드리고자 합니다.
NEAR
WELLDONE Code
RemixIDE
Video
WELLDONE Wallet
Education
SUI
NEP-413: NEAR Wallet SelectorUpdate NEP-413 support method on wallet selector core package
NEAR
WELLDONE Wallet
Open Source
- + \ No newline at end of file diff --git a/aboutus/index.html b/aboutus/index.html index 2089a0c87..04e4b762b 100644 --- a/aboutus/index.html +++ b/aboutus/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ 2. Explore our listing in the official Neutron docs: https://docs.neutron.org/tutorials/cosmwasm_remix Learn more at: https://docs.welldonestudio.io/code/getting-started
  • 🚀 What is @WelldoneStudio_
    🚀 What is @WelldoneStudio_
    supporting the developer ecosystem at @dsrvlabs, doing in the @SuiNetwork ecosystem? Let's dive in! (1/5)
  • 🎊 Exciting news! @WelldoneStudio_
    🎊 Exciting news! @WelldoneStudio_
    has been awarded a grant from @SuiNetwork following a rigorous milestone review.
  • #WELLDONEAcademy 2nd
    #WELLDONEAcademy 2nd
    다음 달 #SuiBuilderHouse in Seoul을 앞두고, #WELLDONEAcademy 가 진행됐습니다🧑‍💻 이번 웰던 아카데미는 Sui에 대한 소개와 이론, 실제 온보딩까지의 지식을 한국의 #Sui 빌더들과 함께 나누었고, @SuiNetwork의 @theharrisonkim님도 함께 해주셔 더욱 뜻깊은 시간을 만들어 나갔습니다 🥳 @dsrvlabs
  • 🔭 Voyagers, ready for #SuiBuilderHouse Hackathon in Seoul?
    🔭 Voyagers, ready for #SuiBuilderHouse Hackathon in Seoul?
    Dive into browser-based #WELLDONEWallet & #WELLDONECode to build @SuiNetwork's apps.
  • Ready to launch your Coin on Aptos?
    Ready to launch your Coin on Aptos?
    Use #WELLDONEWallet and #WELLDONECode and deploy directly through #RemixIDE.
  • Hoi! 🇳🇱 the Hack Holland #AptosWorldTour.
    Hoi! 🇳🇱 the Hack Holland #AptosWorldTour.
    we're equipping your Move-ment to be 'Apt to Succeed' on your #Aptos voyage. Let's foster the bloom of #Web3 🌷!
  • NEAR Blockchain Foundation Week
    NEAR Blockchain Foundation Week
    @suji_forcrypto's presentation at @Xangle_official Blockchain Foundation Week.
  • Xin chào, Voyagers!
    Xin chào, Voyagers!
    Kicking off with our WELLDONE Wallet presentation, look forward to new dev tools next month! Stay tuned!
  • 🇭🇰 We Showcased our contributions to @SuiNetwork
    🇭🇰 We Showcased our contributions to @SuiNetwork
    🎉 Fantastic session at the #SuiBuilderHouse event in Hong Kong today!
  • Annyeonghaseyo! 🇰🇷
    Annyeonghaseyo! 🇰🇷
    we were thrilled to conduct a workshop on #WELLDONEWallet & #WELLDONECode for #Sui users! We hope you found it useful for optimizing your onboarding process.
  • The future is #NEAR, and #BOS is the Future!
    The future is #NEAR, and #BOS is the Future!
    Great chat with @ilblackdragon, CEO of @NEARProtocol!
  • Sui Move Developer Coworking Meetup
    Sui Move Developer Coworking Meetup
    🧑‍💻 Exciting 'Sui Move Developer Coworking Meetup' (모각코) in Seoul today!
  • At our workshop hosted by @AwesomWasm,
    At our workshop hosted by @AwesomWasm,
    We demonstrated how #WELLDONEWallet & #WELLDONECode can help onboard newcomers or developers from other chains to Neutron_org with ease.
  • Thanks to @CosmWasm and @misangmadrid for the fantastic invitation to the incredible #HackWasm event!
    Thanks to @CosmWasm and @misangmadrid for the fantastic invitation to the incredible #HackWasm event!
    In our session, we delved into the core of code verification and had insightful discussions for the robustness of the Cosmwasm ecosystem. It was an awesome and WELLDONE time😆! @cosmos @AwesomWasm @Neutron_org @dsrvlabs
  • 🎉 What a fantastic session at @ethconkr!
    🎉 What a fantastic session at @ethconkr!
    WELLDONE Studio talked about our brilliant collaboration with @EthereumRemix, our unified philosophy on multi-chains, and the future of sustainable blockchain dev infrastructure.
  • 🙌 Big S/O to Rob from @EthereumRemix and @maczniak from @AllThatNode for the Remix ZKP Challenge!
    🙌 Big S/O to Rob from @EthereumRemix and @maczniak from @AllThatNode for the Remix ZKP Challenge!
    We used Remix to submit proofs instead of direct answers, ensuring privacy while proving solutions. Correct proofs could earn a Remixer NFT. Stay tuned for our next session! #DSRVBuildersHouse
  • Fantastic live session by @sunny_yooo 🚀!
    Fantastic live session by @sunny_yooo 🚀!
    She leveraged @NEARProtocol BOS to decentralize gaming ecosystem an innovative approach to web3 development. We're looking forward to a multi-chain ecosystem on #BOS. Try our @SuiNetwork game on BOS!
  • and...One more thing 👀
    and...One more thing 👀
    To make our idea work seamlessly, we've developed and been using WELLDONE Wallet for multi-chain.
  • 💧@SuiNetwork에 대한 한국어 강의가 필요하신가요?
    💧@SuiNetwork에 대한 한국어 강의가 필요하신가요?
    WELLDONE Studio가 한국 최고의 교육 플랫폼 @inflearn에서 Sui 강의를 무료로 배포합니다. 학습 중 궁금한 것이 생기면 편하게 알려주세요. 찾아오시면 더 좋습니다!
  • Yeah, here we go! 🚀
    Yeah, here we go! 🚀
    🇰🇷 WELLDONE Studio has designed a course tailored for Korean-speaking developers interested in building on the @SuiNetwork.
  • Ready to unlock Arbitrum's potential with Rust on REMIX, $ARB holders?
    Ready to unlock Arbitrum's potential with Rust on REMIX, $ARB holders?
    WELLDONE Code is live at @gitcoin's Grant Funding Fest (Dev Tooling). We integrated @EthereumRemix & @rustlang for EVM+ smart contracts!
  • 🎊 WELLDONE Studio is celebrating the one-year anniversary of @aptos_network mainnet launch!
    🎊 WELLDONE Studio is celebrating the one-year anniversary of @aptos_network mainnet launch!
    Our collaboration has created a stronger flow for the L1 blockchain with Move language, and the grant proves it. Let's keep pushing forward together 😉.
  • 💙 Sharing a fantastic partnership session with the @EthereumRemix team!
    💙 Sharing a fantastic partnership session with the @EthereumRemix team!
    Our collaboration is just beginning, with the aim of further enriching the multi-chain ecosystem!
  • @dsrv/kms by WELLDONE Studio is making a new history as a multi-chain key management package!
    @dsrv/kms by WELLDONE Studio is making a new history as a multi-chain key management package!
    Explore keys, signatures, and wallets with our experts from @dsrvlabs
  • 😉WELL-DONE, @movebuilders!
    😉WELL-DONE, @movebuilders!
    We'll always grind to make onboarding for #movelang easier with @EthereumRemix 🚀 #PublicGoodsAreGood
  • <Secure Coding: Essential for Safe Applications >
    <Secure Coding: Essential for Safe Applications >
    🛡 In a dynamic multi-chain dev ecosystem, secure coding is crucial. Last week, WELLDONE Studio held a workshop envisioning an ideal Web3 environment, emphasizing secure practices. Let's always prioritize our code safety!
  • <WELLDONE Studio's 2023 Milestones>
    <WELLDONE Studio's 2023 Milestones>
    Wrapping up 2023, we reflect on a remarkable year at WELLDONE Studio! 🚀
  • We have just unveiled an article on the Aptos Account Model
    We have just unveiled an article on the Aptos Account Model
    Resource Accounts, Standard Accounts, Object Model. Available in both English and Korean.

  • For Web3 Voyagers.

    Elevating the Web3 space, our brand paves the way for a streamlined journey across the digital frontier. We champion standardization, offering state-of-the-art tools that translate into a seamless, consistent experience for Web3 explorers.

    With us, the value of Web3 unfolds through a harmonized expedition, universally accessible. We leave our footprint at every Web3 gateway, demonstrating our contribution and pioneering expertise in the ever-evolving Web3 standards. Explore with us. Pioneer with us. Let's shape the future of Web3 together.

    WELLDONE


    Our Members

    👉👉 Link 👈👈

    - + \ No newline at end of file diff --git a/assets/js/2b9123c9.26b26bfa.js b/assets/js/2b9123c9.26b26bfa.js new file mode 100644 index 000000000..40e3c0b80 --- /dev/null +++ b/assets/js/2b9123c9.26b26bfa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[7362],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=o.createContext({}),l=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(n),m=r,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l\n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.rs\n \u2514\u2500\u2500 examples\n \u2514\u2500\u2500 schema.rs \n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server. The build environment is crucial for contract verification due to the non-deterministic nature of building Rust into Wasm.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm and schema files are returned."),(0,a.kt)("img",{src:n(83479).Z,alt:"neutron-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned wasm file and schema files in ",(0,a.kt)("inlineCode",{parentName:"p"},"neutron//artifacts")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"neutron//schema"),"."),(0,a.kt)("p",{parentName:"admonition"},"When you run the recompilation, the existing ",(0,a.kt)("inlineCode",{parentName:"p"},"artifacts")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"schema")," folders will be deleted and the compilation process will start anew.")),(0,a.kt)("h2",{id:"store-code"},"Store Code"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Store Code")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Gas price is set to 0.025 untrn/untrnx as a default and can be modified. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Store Code")," button."),(0,a.kt)("img",{src:n(21802).Z,alt:"neutron-store-code",style:{width:"70%"}}),(0,a.kt)("h2",{id:"instantiate-the-contract"},"Instantiate the Contract"),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,a.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can choose whether to allow contract upgrades or make them unmodifiable through the immutable option."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": If there are arguments for contract instantiation, input the parameters and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Instantiate")," button. The arguments are generated through ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/rjsf-team/react-jsonschema-form"},"react-jsonschema-form"),"."),(0,a.kt)("img",{src:n(4338).Z,alt:"neutron-instantiate",style:{width:"318px"}}),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,a.kt)("inlineCode",{parentName:"p"},"Query")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"Execute")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,a.kt)("img",{src:n(39310).Z,alt:"neutron-execute",style:{width:"100%"}}),(0,a.kt)("h2",{id:"migrate-the-contract"},"Migrate the Contract"),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,a.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Select the method as ",(0,a.kt)("inlineCode",{parentName:"p"},"migrate"),"."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": Enter the target contract address for the migration and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Migrate")," button."),(0,a.kt)("img",{src:n(65583).Z,alt:"neutron-migrate",style:{width:"318px"}}))}m.isMDXComponent=!0},83479:function(e,t,n){t.Z=n.p+"assets/images/compile-neutron-3cb09fb4a3361dda74f242d17a6d2999.png"},39310:function(e,t,n){t.Z=n.p+"assets/images/neutron-execute-bd82e6757e180aa24cbd85b5580e4164.png"},4338:function(e,t,n){t.Z=n.p+"assets/images/neutron-instantiate-4d17efe1d0cd02019a1ad7a966c8a47d.png"},65583:function(e,t,n){t.Z=n.p+"assets/images/neutron-migrate-d828179875e2d8ae62f554dbcdfebea9.png"},21802:function(e,t,n){t.Z=n.p+"assets/images/neutron-store-code-3f097f8777216205609b16ddcc0340f4.png"},69650:function(e,t,n){t.Z=n.p+"assets/images/template-code-neutron-7a08437d450cd74c638086b594036f0c.png"}}]); \ No newline at end of file diff --git a/assets/js/2b9123c9.5151f23d.js b/assets/js/2b9123c9.5151f23d.js deleted file mode 100644 index c55de43af..000000000 --- a/assets/js/2b9123c9.5151f23d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[7362],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),l=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(n),m=o,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||a;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:o,i[1]=c;for(var l=2;l\n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.rs\n \u2514\u2500\u2500 examples\n \u2514\u2500\u2500 schema.rs \n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server. The build environment is crucial for contract verification due to the non-deterministic nature of building Rust into Wasm.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm and schema files are returned."),(0,a.kt)("img",{src:n(83479).Z,alt:"neutron-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned wasm file and schema files in ",(0,a.kt)("inlineCode",{parentName:"p"},"neutron//artifacts")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"neutron//schema"),"."),(0,a.kt)("p",{parentName:"admonition"},"When you run the recompilation, the existing ",(0,a.kt)("inlineCode",{parentName:"p"},"artifacts")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"schema")," folders will be deleted and the compilation process will start anew.")),(0,a.kt)("h2",{id:"store-code"},"Store Code"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Store Code")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Gas price is set to 0.025 untrn/untrnx as a default and can be modified. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Store Code")," button."),(0,a.kt)("img",{src:n(21802).Z,alt:"neutron-store-code",style:{width:"70%"}}),(0,a.kt)("h2",{id:"instantiate-the-contract"},"Instantiate the Contract"),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,a.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can choose whether to allow contract upgrades or make them unmodifiable through the immutable option."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": If there are arguments for contract instantiation, input the parameters and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Instantiate")," button. The arguments are generated through ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/rjsf-team/react-jsonschema-form"},"react-jsonschema-form"),"."),(0,a.kt)("img",{src:n(4338).Z,alt:"neutron-instantiate",style:{width:"318px"}}),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,a.kt)("inlineCode",{parentName:"p"},"Query")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"Execute")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,a.kt)("img",{src:n(39310).Z,alt:"neutron-execute",style:{width:"100%"}}),(0,a.kt)("h2",{id:"migrate-the-contract"},"Migrate the Contract"),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,a.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Select the method as ",(0,a.kt)("inlineCode",{parentName:"p"},"migrate"),"."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": Enter the target contract address for the migration and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Migrate")," button."),(0,a.kt)("img",{src:n(65583).Z,alt:"neutron-migrate",style:{width:"318px"}}))}m.isMDXComponent=!0},83479:function(e,t,n){t.Z=n.p+"assets/images/compile-neutron-3cb09fb4a3361dda74f242d17a6d2999.png"},39310:function(e,t,n){t.Z=n.p+"assets/images/neutron-execute-bd82e6757e180aa24cbd85b5580e4164.png"},4338:function(e,t,n){t.Z=n.p+"assets/images/neutron-instantiate-4d17efe1d0cd02019a1ad7a966c8a47d.png"},65583:function(e,t,n){t.Z=n.p+"assets/images/neutron-migrate-d828179875e2d8ae62f554dbcdfebea9.png"},21802:function(e,t,n){t.Z=n.p+"assets/images/neutron-store-code-3f097f8777216205609b16ddcc0340f4.png"},69650:function(e,t,n){t.Z=n.p+"assets/images/template-code-neutron-7a08437d450cd74c638086b594036f0c.png"}}]); \ No newline at end of file diff --git a/assets/js/363b7c43.59819270.js b/assets/js/363b7c43.59819270.js deleted file mode 100644 index fc6e0a986..000000000 --- a/assets/js/363b7c43.59819270.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[5983],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=p(n),m=r,h=d["".concat(l,".").concat(m)]||d[m]||s[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p\n \u251c\u2500\u2500 Move.toml\n \u251c\u2500\u2500 Move.lock\n \u2514\u2500\u2500 sources\n \u2514\u2500\u2500 YOUR_CONTRACT_FILE.move\n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a compiled binary file is returned."),(0,a.kt)("img",{src:n(29671).Z,alt:"sui-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned compiled binary file in ",(0,a.kt)("inlineCode",{parentName:"p"},"sui//out")," directory.")),(0,a.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," to sign the transaction."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:n(78844).Z,title:"Deploy",width:"2418",height:"1664"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),"\n: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:n(2857).Z,title:"Deploy",width:"2408",height:"1618"})),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"There are two ways to import contracts."),(0,a.kt)("ol",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ol"},"Automatically import contracts deployed through the above process."),(0,a.kt)("li",{parentName:"ol"},"Import existing deployed contracts through ",(0,a.kt)("inlineCode",{parentName:"li"},"At Address")," button."))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": You can check the Packages, and Modules owned by the current account, and you can read the Objects through the ",(0,a.kt)("inlineCode",{parentName:"p"},"Query Object")," button."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," is required because the transaction signature and request are required."),(0,a.kt)("img",{src:n(22920).Z,alt:"entry-sui",style:{width:"500px"}}))}m.isMDXComponent=!0},22920:function(e,t,n){t.Z=n.p+"assets/images/entry-sui-436aba0195b3372d932635c0fb52a324.png"},92765:function(e,t,n){t.Z=n.p+"assets/images/new-project-sui-d601ee9d8bfcaf072ca1f96eb7d793a1.png"},29671:function(e,t,n){t.Z=n.p+"assets/images/sui-compile-c17f51ca90231770cf8293fa3363c37f.png"},29720:function(e,t,n){t.Z=n.p+"assets/images/template-code-sui-fe2887b64d67bb396e9cec6752cc40c9.png"},78844:function(e,t,n){t.Z=n.p+"assets/images/deploy-sui-1d4182f860ef8f7ece06be39ad285d7b.png"},2857:function(e,t,n){t.Z=n.p+"assets/images/deployed-contract-sui-a169574d6f57a0ad35a473a619c163ae.png"}}]); \ No newline at end of file diff --git a/assets/js/363b7c43.c3c8d047.js b/assets/js/363b7c43.c3c8d047.js new file mode 100644 index 000000000..c4a3a343e --- /dev/null +++ b/assets/js/363b7c43.c3c8d047.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[5983],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=p(n),m=r,h=d["".concat(l,".").concat(m)]||d[m]||s[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p\n \u251c\u2500\u2500 Move.toml\n \u251c\u2500\u2500 Move.lock\n \u2514\u2500\u2500 sources\n \u2514\u2500\u2500 YOUR_CONTRACT_FILE.move\n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a compiled binary file is returned."),(0,a.kt)("img",{src:n(29671).Z,alt:"sui-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned compiled binary file in ",(0,a.kt)("inlineCode",{parentName:"p"},"sui//out")," directory.")),(0,a.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," to sign the transaction."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:n(78844).Z,title:"Deploy",width:"2418",height:"1664"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),"\n: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:n(2857).Z,title:"Deploy",width:"2408",height:"1618"})),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"There are two ways to import contracts."),(0,a.kt)("ol",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ol"},"Automatically import contracts deployed through the above process."),(0,a.kt)("li",{parentName:"ol"},"Import existing deployed contracts through ",(0,a.kt)("inlineCode",{parentName:"li"},"At Address")," button."))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": You can check the Packages, and Modules owned by the current account, and you can read the Objects through the ",(0,a.kt)("inlineCode",{parentName:"p"},"Query Object")," button."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," is required because the transaction signature and request are required."),(0,a.kt)("img",{src:n(22920).Z,alt:"entry-sui",style:{width:"500px"}}))}m.isMDXComponent=!0},22920:function(e,t,n){t.Z=n.p+"assets/images/entry-sui-436aba0195b3372d932635c0fb52a324.png"},92765:function(e,t,n){t.Z=n.p+"assets/images/new-project-sui-d601ee9d8bfcaf072ca1f96eb7d793a1.png"},29671:function(e,t,n){t.Z=n.p+"assets/images/sui-compile-c17f51ca90231770cf8293fa3363c37f.png"},29720:function(e,t,n){t.Z=n.p+"assets/images/template-code-sui-fe2887b64d67bb396e9cec6752cc40c9.png"},78844:function(e,t,n){t.Z=n.p+"assets/images/deploy-sui-1d4182f860ef8f7ece06be39ad285d7b.png"},2857:function(e,t,n){t.Z=n.p+"assets/images/deployed-contract-sui-a169574d6f57a0ad35a473a619c163ae.png"}}]); \ No newline at end of file diff --git a/assets/js/45d4b96f.69ed149d.js b/assets/js/45d4b96f.69ed149d.js deleted file mode 100644 index a473b7c7d..000000000 --- a/assets/js/45d4b96f.69ed149d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[6216],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=o.createContext({}),l=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(n),m=a,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||r;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var l=2;l\n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.rs\n \u2514\u2500\u2500 examples\n \u2514\u2500\u2500 schema.rs \n")),(0,r.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,r.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm and schema files are returned."),(0,r.kt)("img",{src:n(4443).Z,alt:"juno-compile",style:{width:"318px"}}),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can check the returned wasm file and schema files in ",(0,r.kt)("inlineCode",{parentName:"p"},"juno//artifacts")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"juno//schema"),"."),(0,r.kt)("p",{parentName:"admonition"},"If you need to revise the contract and compile again, delete the ",(0,r.kt)("inlineCode",{parentName:"p"},"artifacts"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"schema")," directory and click the compile button.")),(0,r.kt)("h2",{id:"store-code"},"Store Code"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,r.kt)("inlineCode",{parentName:"p"},"Store Code")," button will be activated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Gas price is set to 0.025 ujuno/ujunox as a default and can be modified. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": Click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Store Code")," button."),(0,r.kt)("img",{src:n(42724).Z,alt:"juno-store-code",style:{width:"70%"}}),(0,r.kt)("h2",{id:"instantiate-the-contract"},"Instantiate the Contract"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,r.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": If there are arguments for contract instantiation, input the parameters and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Instantiate")," button. The arguments are generated through ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/rjsf-team/react-jsonschema-form"},"react-jsonschema-form"),"."),(0,r.kt)("img",{src:n(37738).Z,alt:"juno-instantiate",style:{width:"318px"}}),(0,r.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,r.kt)("inlineCode",{parentName:"p"},"Query")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"Execute")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,r.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,r.kt)("img",{src:n(77713).Z,alt:"juno-execute",style:{width:"100%"}}))}m.isMDXComponent=!0},4443:function(e,t,n){t.Z=n.p+"assets/images/compile-juno-852c3ad053bd41501e0764375a4c0bd1.png"},77713:function(e,t,n){t.Z=n.p+"assets/images/juno-execute-2ab9815326223dab1f0ac8cb69ff500d.png"},37738:function(e,t,n){t.Z=n.p+"assets/images/juno-instantiate-c6e7b24f3228e6457d1fb5f9492cb96d.png"},42724:function(e,t,n){t.Z=n.p+"assets/images/juno-store-code-289df63ac1d4ac3150cc0b25b6bff3e7.png"},56488:function(e,t,n){t.Z=n.p+"assets/images/template-code-juno-89e4d17b19e0bc9954b9b3a7677cdbe3.png"}}]); \ No newline at end of file diff --git a/assets/js/45d4b96f.77531d3f.js b/assets/js/45d4b96f.77531d3f.js new file mode 100644 index 000000000..ed51fcd26 --- /dev/null +++ b/assets/js/45d4b96f.77531d3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[6216],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=o.createContext({}),l=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(n),m=a,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||r;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var l=2;l\n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.rs\n \u2514\u2500\u2500 examples\n \u2514\u2500\u2500 schema.rs \n")),(0,r.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,r.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm and schema files are returned."),(0,r.kt)("img",{src:n(4443).Z,alt:"juno-compile",style:{width:"318px"}}),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can check the returned wasm file and schema files in ",(0,r.kt)("inlineCode",{parentName:"p"},"juno//artifacts")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"juno//schema"),"."),(0,r.kt)("p",{parentName:"admonition"},"If you need to revise the contract and compile again, delete the ",(0,r.kt)("inlineCode",{parentName:"p"},"artifacts"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"schema")," directory and click the compile button.")),(0,r.kt)("h2",{id:"store-code"},"Store Code"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,r.kt)("inlineCode",{parentName:"p"},"Store Code")," button will be activated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Gas price is set to 0.025 ujuno/ujunox as a default and can be modified. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": Click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Store Code")," button."),(0,r.kt)("img",{src:n(42724).Z,alt:"juno-store-code",style:{width:"70%"}}),(0,r.kt)("h2",{id:"instantiate-the-contract"},"Instantiate the Contract"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,r.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": If there are arguments for contract instantiation, input the parameters and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Instantiate")," button. The arguments are generated through ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/rjsf-team/react-jsonschema-form"},"react-jsonschema-form"),"."),(0,r.kt)("img",{src:n(37738).Z,alt:"juno-instantiate",style:{width:"318px"}}),(0,r.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,r.kt)("inlineCode",{parentName:"p"},"Query")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"Execute")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,r.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,r.kt)("img",{src:n(77713).Z,alt:"juno-execute",style:{width:"100%"}}))}m.isMDXComponent=!0},4443:function(e,t,n){t.Z=n.p+"assets/images/compile-juno-852c3ad053bd41501e0764375a4c0bd1.png"},77713:function(e,t,n){t.Z=n.p+"assets/images/juno-execute-2ab9815326223dab1f0ac8cb69ff500d.png"},37738:function(e,t,n){t.Z=n.p+"assets/images/juno-instantiate-c6e7b24f3228e6457d1fb5f9492cb96d.png"},42724:function(e,t,n){t.Z=n.p+"assets/images/juno-store-code-289df63ac1d4ac3150cc0b25b6bff3e7.png"},56488:function(e,t,n){t.Z=n.p+"assets/images/template-code-juno-89e4d17b19e0bc9954b9b3a7677cdbe3.png"}}]); \ No newline at end of file diff --git a/assets/js/d8744fac.6e4db9c5.js b/assets/js/d8744fac.6e4db9c5.js deleted file mode 100644 index 71d151279..000000000 --- a/assets/js/d8744fac.6e4db9c5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[3083],{3905:function(e,t,n){n.d(t,{Zo:function(){return s},kt:function(){return u}});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=a.createContext({}),l=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=l(e.components);return a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),m=l(n),u=o,g=m["".concat(c,".").concat(u)]||m[u]||d[u]||r;return n?a.createElement(g,i(i({ref:t},s),{},{components:n})):a.createElement(g,i({ref:t},s))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:o,i[1]=p;for(var l=2;lExperimental",id:"2-cargo-near-compile-for-rust---experimental",level:3},{value:"3. EMBED-ABI Compile (for Rust) - Experimental",id:"3-embed-abi-compile-for-rust---experimental",level:3},{value:"4. AssemblyScript Compile",id:"4-assemblyscript-compile",level:3},{value:"5. JavaScript & TypeScript Compile",id:"5-javascript--typescript-compile",level:3},{value:"Deploy the Contract",id:"deploy-the-contract",level:2},{value:"Execute the Contract",id:"execute-the-contract",level:2}],m={toc:d};function u(e){var t=e.components,p=(0,o.Z)(e,i);return(0,r.kt)("wrapper",(0,a.Z)({},m,p,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"near"},"NEAR"),(0,r.kt)("h2",{id:"create-the-project"},"Create the Project"),(0,r.kt)("p",null,"In NEAR, you can write smart contracts with AssemblyScript, Rust, JavaScript, and TypeScript. Because the structure of the contract is different in each language, ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Code")," provides two features to help developers new to NEAR."),(0,r.kt)("h3",{id:"create-template"},"Create Template"),(0,r.kt)("p",null,"Create a simple example contract code written in AssemblyScript, Rust, JavaScript, and TypeScript. You can create a sample contract by selecting the template option and clicking the ",(0,r.kt)("inlineCode",{parentName:"p"},"Create a Template")," button. More templates may be found at ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/near-examples/"},"NEAR Samples"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"template-code-near",src:n(11509).Z,title:"template-code-near",width:"318",height:"182"})),(0,r.kt)("h3",{id:"new-project"},"New Project"),(0,r.kt)("p",null,"Automatically generate a contract structure based on the smart contract language you want to use. Select the language option, write a name for the project, and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"New Project")," button to create a contract structure that is appropriate for the language."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"new-project-near",src:n(88577).Z,title:"new-project-near",width:"318",height:"100"})),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory ",(0,r.kt)("inlineCode",{parentName:"p"},"near/"),". If you start a new project, the structure should look like the following.")),(0,r.kt)("h4",{id:"1-writing-contracts-in-rust"},"1. Writing Contracts in Rust"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n")),(0,r.kt)("h4",{id:"2-writing-contracts-in-assemblyscript"},"2. Writing Contracts in AssemblyScript"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u2514\u2500\u2500 assembly\n \u251c\u2500\u2500 as_types.d.ts\n \u251c\u2500\u2500 index.ts\n \u2514\u2500\u2500 tsconfig.json\n")),(0,r.kt)("h4",{id:"3-writing-contracts-in-typescript"},"3. Writing Contracts in TypeScript"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 package.json\n \u251c\u2500\u2500 babel.config.json\n \u251c\u2500\u2500 tsconfig.json\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.ts\n")),(0,r.kt)("h4",{id:"4-writing-contracts-in-javascript"},"4. Writing Contracts in JavaScript"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 package.json\n \u251c\u2500\u2500 babel.config.json\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.js\n")),(0,r.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Six compilation options are now available in WELLDONE Code: ",(0,r.kt)("inlineCode",{parentName:"p"},"Rust"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"CARGO-NEAR"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"EMBED-ABI"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"AssemblyScript"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"JavaScript"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"TypeScript"),"."),(0,r.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server, however, we will shortly add support for the ARM compilation server.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,r.kt)("strong",{parentName:"p"},"PROJECT TO COMPILE")," section."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm file is returned."),(0,r.kt)("img",{src:n(25062).Z,alt:"near-compile",style:{width:"318px"}}),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can check the returned wasm file in ",(0,r.kt)("inlineCode",{parentName:"p"},"near//out")," directory."),(0,r.kt)("p",{parentName:"admonition"},"If you need to revise the contract and compile again, delete the ",(0,r.kt)("inlineCode",{parentName:"p"},"out")," directory and click the compile button.")),(0,r.kt)("h3",{id:"1-rust-compile"},"1. Rust Compile"),(0,r.kt)("p",null,"Using the ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo build")," command to compile a smart contract written in Rust. Although it offers a stable compile, it is inconvenient to enter the method's parameters directly when executing the contract."),(0,r.kt)("h3",{id:"2-cargo-near-compile-for-rust---experimental"},"2. CARGO-NEAR Compile (for Rust) - ",(0,r.kt)("inlineCode",{parentName:"h3"},"Experimental")),(0,r.kt)("p",null,"Compile using ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo near")," which is officially being developed by NEAR. If Compile is successful, an executable wasm binary file and a json file containing the ABI of the contract are created together. If you have deployed and imported a compiled contract using ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo-near"),", you can find out the parameter type of the method, making it easier to run the contract."),(0,r.kt)("p",null,"However, because this feature is still under development, the ",(0,r.kt)("inlineCode",{parentName:"p"},"near-sdk-rs")," version must be specified at ",(0,r.kt)("strong",{parentName:"p"},"4.1.0")," or higher in the ",(0,r.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," file, and unexpected issues may occur during compilation. Please check out the NEAR's ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/near/abi"},"repository")," for more detail."),(0,r.kt)("h3",{id:"3-embed-abi-compile-for-rust---experimental"},"3. EMBED-ABI Compile (for Rust) - ",(0,r.kt)("inlineCode",{parentName:"h3"},"Experimental")),(0,r.kt)("p",null,"When using ",(0,r.kt)("inlineCode",{parentName:"p"},"-embed-abi")," option in ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo-near"),", generates a wasm file containing ABI inside. For contracts that have deployed the wasm file compiling with this option, you can get ABI information even when importing the contract through ",(0,r.kt)("inlineCode",{parentName:"p"},"At Address")," button. See the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/near/cargo-near"},"cargo-near")," repository for a detailed description of the options."),(0,r.kt)("h3",{id:"4-assemblyscript-compile"},"4. AssemblyScript Compile"),(0,r.kt)("p",null,"Using ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/AssemblyScript/asbuild"},(0,r.kt)("inlineCode",{parentName:"a"},"asbuild"))," to compile a smart contract written in AssemblyScript. The compiler provides a stable compiling."),(0,r.kt)("h3",{id:"5-javascript--typescript-compile"},"5. JavaScript & TypeScript Compile"),(0,r.kt)("p",null,"Using ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/near/near-sdk-js"},(0,r.kt)("inlineCode",{parentName:"a"},"near-sdk-js"))," to compile a smart contract written in JavaScript or TypeScript."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"If you are using JavaScript or TypeScript compile options, you must write the name of the contract file you want to compile as follows to ensure that the compilation runs without error."),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"JavaScript: ",(0,r.kt)("inlineCode",{parentName:"li"},"contract.js")),(0,r.kt)("li",{parentName:"ul"},"TypeScript: ",(0,r.kt)("inlineCode",{parentName:"li"},"contract.ts")," "))),(0,r.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,r.kt)("inlineCode",{parentName:"p"},"Deploy")," button will be activated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Enter the Account ID for which you want to deployed the contract and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Deploy")," button. If you want to add ",(0,r.kt)("inlineCode",{parentName:"p"},"init function"),", click ",(0,r.kt)("inlineCode",{parentName:"p"},"Deploy Option")," to add the method name and arguments."),(0,r.kt)("img",{src:n(65634).Z,alt:"deploy-option-near",style:{width:"318px"}}),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": If the AccountId already has a deployed contract, confirm once more."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 4"),": Click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Send Tx")," button in the ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," to sign the transaction."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Deploy",src:n(44633).Z,title:"Deploy",width:"713",height:"870"})),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 5"),": A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful."),(0,r.kt)("img",{src:n(49176).Z,alt:"deployed-contract-near",style:{width:"318px"}}),(0,r.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"There are two ways to import contracts."),(0,r.kt)("ol",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ol"},"Automatically import contracts deployed through the above process."),(0,r.kt)("li",{parentName:"ol"},"Import existing deployed contracts through ",(0,r.kt)("inlineCode",{parentName:"li"},"At Address")," button."))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": In the case of the ",(0,r.kt)("inlineCode",{parentName:"p"},"Call")," function, You can specify the number of NEAR tokens to attach to a function call and the GAS LIMIT."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,r.kt)("inlineCode",{parentName:"p"},"View")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"Call")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,r.kt)("inlineCode",{parentName:"p"},"Send Tx")," button in the ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,r.kt)("img",{src:n(10844).Z,alt:"function-call",style:{width:"318px"}}),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"If you deployed the compiled contract using ",(0,r.kt)("inlineCode",{parentName:"p"},"CARGO-NEAR")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"EMBED-ABI")," options, you can execute the contract more easily using the ABI without directly entering the parameters of the method.")),(0,r.kt)("img",{src:n(3059).Z,alt:"cargo-near",style:{width:"318px"}}),(0,r.kt)("img",{src:n(26221).Z,alt:"cargo-near1",style:{width:"318px"}}),(0,r.kt)("img",{src:n(26382).Z,alt:"cargo-near2",style:{width:"318px"}}))}u.isMDXComponent=!0},3059:function(e,t,n){t.Z=n.p+"assets/images/cargo-near-c568fd71c61f12a85da6cc7d0dfa1287.png"},26221:function(e,t,n){t.Z=n.p+"assets/images/cargo-near1-63a86879b1ab80e22f7ffaeef8b8e0af.png"},26382:function(e,t){t.Z="data:image/png;base64,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"},65634:function(e,t,n){t.Z=n.p+"assets/images/deploy-option-near-fdbe115f2a885fcaf1f1f6ad4eb2995c.png"},49176:function(e,t,n){t.Z=n.p+"assets/images/deployed-contract-near-7efeed4abf28f4791c3f9d54dac7083e.png"},10844:function(e,t,n){t.Z=n.p+"assets/images/function-call-847ffb3dc6c1386cd8c482602eb68864.png"},25062:function(e,t,n){t.Z=n.p+"assets/images/project-compile-8d1e5eaf8fb296055fc02c6f0cb4825c.png"},44633:function(e,t,n){t.Z=n.p+"assets/images/deploy-near-5064c578366ef3cbf0eb88a7d241e2f7.png"},88577:function(e,t,n){t.Z=n.p+"assets/images/new-project-near-66c80e06b15f523ccd5a53569fbefb89.png"},11509:function(e,t,n){t.Z=n.p+"assets/images/template-code-near-9cb4d704a5d9a66a5b8058a4f7aa8e54.png"}}]); \ No newline at end of file diff --git a/assets/js/d8744fac.e1b46891.js b/assets/js/d8744fac.e1b46891.js new file mode 100644 index 000000000..ba0ed15ee --- /dev/null +++ b/assets/js/d8744fac.e1b46891.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[3083],{3905:function(e,t,n){n.d(t,{Zo:function(){return s},kt:function(){return u}});var a=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=a.createContext({}),l=function(e){var t=a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=l(e.components);return a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),m=l(n),u=o,g=m["".concat(c,".").concat(u)]||m[u]||d[u]||r;return n?a.createElement(g,i(i({ref:t},s),{},{components:n})):a.createElement(g,i({ref:t},s))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:o,i[1]=p;for(var l=2;lExperimental",id:"2-cargo-near-compile-for-rust---experimental",level:3},{value:"3. EMBED-ABI Compile (for Rust) - Experimental",id:"3-embed-abi-compile-for-rust---experimental",level:3},{value:"4. AssemblyScript Compile",id:"4-assemblyscript-compile",level:3},{value:"5. JavaScript & TypeScript Compile",id:"5-javascript--typescript-compile",level:3},{value:"Deploy the Contract",id:"deploy-the-contract",level:2},{value:"Execute the Contract",id:"execute-the-contract",level:2}],m={toc:d};function u(e){var t=e.components,p=(0,o.Z)(e,i);return(0,r.kt)("wrapper",(0,a.Z)({},m,p,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"near"},"NEAR"),(0,r.kt)("h2",{id:"connect-to-welldone-code"},"Connect to WELLDONE Code"),(0,r.kt)("p",null,"You can activate the ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Code")," plugin by accessing this deep link: ",(0,r.kt)("a",{parentName:"p",href:"https://remix.ethereum.org/?#activate=wds-code-remix"},"WELLDONE Code Remix Plugin"),"."),(0,r.kt)("h2",{id:"create-the-project"},"Create the Project"),(0,r.kt)("p",null,"In NEAR, you can write smart contracts with AssemblyScript, Rust, JavaScript, and TypeScript. Because the structure of the contract is different in each language, ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Code")," provides two features to help developers new to NEAR."),(0,r.kt)("h3",{id:"create-template"},"Create Template"),(0,r.kt)("p",null,"Create a simple example contract code written in AssemblyScript, Rust, JavaScript, and TypeScript. You can create a sample contract by selecting the template option and clicking the ",(0,r.kt)("inlineCode",{parentName:"p"},"Create a Template")," button. More templates may be found at ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/near-examples/"},"NEAR Samples"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"template-code-near",src:n(11509).Z,title:"template-code-near",width:"318",height:"182"})),(0,r.kt)("h3",{id:"new-project"},"New Project"),(0,r.kt)("p",null,"Automatically generate a contract structure based on the smart contract language you want to use. Select the language option, write a name for the project, and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"New Project")," button to create a contract structure that is appropriate for the language."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"new-project-near",src:n(88577).Z,title:"new-project-near",width:"318",height:"100"})),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory ",(0,r.kt)("inlineCode",{parentName:"p"},"near/"),". If you start a new project, the structure should look like the following.")),(0,r.kt)("h4",{id:"1-writing-contracts-in-rust"},"1. Writing Contracts in Rust"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n")),(0,r.kt)("h4",{id:"2-writing-contracts-in-assemblyscript"},"2. Writing Contracts in AssemblyScript"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u2514\u2500\u2500 assembly\n \u251c\u2500\u2500 as_types.d.ts\n \u251c\u2500\u2500 index.ts\n \u2514\u2500\u2500 tsconfig.json\n")),(0,r.kt)("h4",{id:"3-writing-contracts-in-typescript"},"3. Writing Contracts in TypeScript"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 package.json\n \u251c\u2500\u2500 babel.config.json\n \u251c\u2500\u2500 tsconfig.json\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.ts\n")),(0,r.kt)("h4",{id:"4-writing-contracts-in-javascript"},"4. Writing Contracts in JavaScript"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 package.json\n \u251c\u2500\u2500 babel.config.json\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.js\n")),(0,r.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Six compilation options are now available in WELLDONE Code: ",(0,r.kt)("inlineCode",{parentName:"p"},"Rust"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"CARGO-NEAR"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"EMBED-ABI"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"AssemblyScript"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"JavaScript"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"TypeScript"),"."),(0,r.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server, however, we will shortly add support for the ARM compilation server.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,r.kt)("strong",{parentName:"p"},"PROJECT TO COMPILE")," section."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm file is returned."),(0,r.kt)("img",{src:n(25062).Z,alt:"near-compile",style:{width:"318px"}}),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can check the returned wasm file in ",(0,r.kt)("inlineCode",{parentName:"p"},"near//out")," directory."),(0,r.kt)("p",{parentName:"admonition"},"If you need to revise the contract and compile again, delete the ",(0,r.kt)("inlineCode",{parentName:"p"},"out")," directory and click the compile button.")),(0,r.kt)("h3",{id:"1-rust-compile"},"1. Rust Compile"),(0,r.kt)("p",null,"Using the ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo build")," command to compile a smart contract written in Rust. Although it offers a stable compile, it is inconvenient to enter the method's parameters directly when executing the contract."),(0,r.kt)("h3",{id:"2-cargo-near-compile-for-rust---experimental"},"2. CARGO-NEAR Compile (for Rust) - ",(0,r.kt)("inlineCode",{parentName:"h3"},"Experimental")),(0,r.kt)("p",null,"Compile using ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo near")," which is officially being developed by NEAR. If Compile is successful, an executable wasm binary file and a json file containing the ABI of the contract are created together. If you have deployed and imported a compiled contract using ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo-near"),", you can find out the parameter type of the method, making it easier to run the contract."),(0,r.kt)("p",null,"However, because this feature is still under development, the ",(0,r.kt)("inlineCode",{parentName:"p"},"near-sdk-rs")," version must be specified at ",(0,r.kt)("strong",{parentName:"p"},"4.1.0")," or higher in the ",(0,r.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," file, and unexpected issues may occur during compilation. Please check out the NEAR's ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/near/abi"},"repository")," for more detail."),(0,r.kt)("h3",{id:"3-embed-abi-compile-for-rust---experimental"},"3. EMBED-ABI Compile (for Rust) - ",(0,r.kt)("inlineCode",{parentName:"h3"},"Experimental")),(0,r.kt)("p",null,"When using ",(0,r.kt)("inlineCode",{parentName:"p"},"-embed-abi")," option in ",(0,r.kt)("inlineCode",{parentName:"p"},"cargo-near"),", generates a wasm file containing ABI inside. For contracts that have deployed the wasm file compiling with this option, you can get ABI information even when importing the contract through ",(0,r.kt)("inlineCode",{parentName:"p"},"At Address")," button. See the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/near/cargo-near"},"cargo-near")," repository for a detailed description of the options."),(0,r.kt)("h3",{id:"4-assemblyscript-compile"},"4. AssemblyScript Compile"),(0,r.kt)("p",null,"Using ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/AssemblyScript/asbuild"},(0,r.kt)("inlineCode",{parentName:"a"},"asbuild"))," to compile a smart contract written in AssemblyScript. The compiler provides a stable compiling."),(0,r.kt)("h3",{id:"5-javascript--typescript-compile"},"5. JavaScript & TypeScript Compile"),(0,r.kt)("p",null,"Using ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/near/near-sdk-js"},(0,r.kt)("inlineCode",{parentName:"a"},"near-sdk-js"))," to compile a smart contract written in JavaScript or TypeScript."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"If you are using JavaScript or TypeScript compile options, you must write the name of the contract file you want to compile as follows to ensure that the compilation runs without error."),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"JavaScript: ",(0,r.kt)("inlineCode",{parentName:"li"},"contract.js")),(0,r.kt)("li",{parentName:"ul"},"TypeScript: ",(0,r.kt)("inlineCode",{parentName:"li"},"contract.ts")," "))),(0,r.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,r.kt)("inlineCode",{parentName:"p"},"Deploy")," button will be activated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Enter the Account ID for which you want to deployed the contract and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Deploy")," button. If you want to add ",(0,r.kt)("inlineCode",{parentName:"p"},"init function"),", click ",(0,r.kt)("inlineCode",{parentName:"p"},"Deploy Option")," to add the method name and arguments."),(0,r.kt)("img",{src:n(65634).Z,alt:"deploy-option-near",style:{width:"318px"}}),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": If the AccountId already has a deployed contract, confirm once more."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 4"),": Click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Send Tx")," button in the ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," to sign the transaction."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Deploy",src:n(44633).Z,title:"Deploy",width:"713",height:"870"})),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 5"),": A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful."),(0,r.kt)("img",{src:n(49176).Z,alt:"deployed-contract-near",style:{width:"318px"}}),(0,r.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"There are two ways to import contracts."),(0,r.kt)("ol",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ol"},"Automatically import contracts deployed through the above process."),(0,r.kt)("li",{parentName:"ol"},"Import existing deployed contracts through ",(0,r.kt)("inlineCode",{parentName:"li"},"At Address")," button."))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": In the case of the ",(0,r.kt)("inlineCode",{parentName:"p"},"Call")," function, You can specify the number of NEAR tokens to attach to a function call and the GAS LIMIT."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,r.kt)("inlineCode",{parentName:"p"},"View")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"Call")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,r.kt)("inlineCode",{parentName:"p"},"Send Tx")," button in the ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,r.kt)("img",{src:n(10844).Z,alt:"function-call",style:{width:"318px"}}),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"If you deployed the compiled contract using ",(0,r.kt)("inlineCode",{parentName:"p"},"CARGO-NEAR")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"EMBED-ABI")," options, you can execute the contract more easily using the ABI without directly entering the parameters of the method.")),(0,r.kt)("img",{src:n(3059).Z,alt:"cargo-near",style:{width:"318px"}}),(0,r.kt)("img",{src:n(26221).Z,alt:"cargo-near1",style:{width:"318px"}}),(0,r.kt)("img",{src:n(26382).Z,alt:"cargo-near2",style:{width:"318px"}}))}u.isMDXComponent=!0},3059:function(e,t,n){t.Z=n.p+"assets/images/cargo-near-c568fd71c61f12a85da6cc7d0dfa1287.png"},26221:function(e,t,n){t.Z=n.p+"assets/images/cargo-near1-63a86879b1ab80e22f7ffaeef8b8e0af.png"},26382:function(e,t){t.Z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATsAAABwCAYAAABhNNfcAAABR2lDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8bAwyDCwMUgxiCcmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsgs63WXnVdfSy//Ui0neujiAjZM9SiAKyW1OBlI/wHitOSCohIGBsYUIFu5vKQAxO4AskWKgI4CsueA2OkQ9gYQOwnCPgJWExLkDGTfALIFkjMSgWYwvgCydZKQxNOR2FB7QYAn1CckyN9PwdjI3IKAc0kHJakVJSDaOb+gsigzPaNEwREYSqkKnnnJejoKRgZGRgwMoDCHqP4cBA5LRrF9CLH8JQwMFt8YGJgnIsSSpjAwbG9jYJC4hRBTmcfAwN/CwLDtUEFiUSLcAYzfWIrTjI0gbB57BgbWu///f9ZgYGCfyMDwd+L//78X////dzHQ/NsMDAcqAWelYRKOYoPxAAAAVmVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAADkoYABwAAABIAAABEoAIABAAAAAEAAAE7oAMABAAAAAEAAABwAAAAAEFTQ0lJAAAAU2NyZWVuc2hvdHs0hlYAAAHWaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjExMjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4zMTU8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KNk+gkgAAC0dJREFUeAHt3etvFNcdxvHf2mu8xji+rb1gbLDXGFNCEkCkJoATCESBNCWBSpQkrdoikraR2iqqlIpX7R/QV1VfVKpU9UWlqmojhQqigEkgJCUmoSmEcjUBF1+wMTa+wvqy654z9mzWxgizs96dGX9H2szseM6Zcz5HenJmZnfxVFXXjMr4UlDkl7bmZvNtXGvfvBzxRCJxlaUQAgggMFlgNC1NQv19k3dP+31JadA4Nm3aJTgQAQQQcLCAdybaPjw0OBPVUicCCMxCAa8vKyG9npGw82ZkqsZxKZuQEaISBGatgEf1XL8Ss8zQZSxBl5jhoRYEZrOAfpyQuCyZobCbzQNE3xFAwI4ChJ0dR4U2IYBAwgUIu4STUiECCNhRgLCz46jQJgQQSLgAYZdwUipEAAE7ChB2dhwV2oQAAgkXIOwSTkqFCCBgRwHCzo6jQpsQQCDhAoRdwkmpEAEE7ChA2NlxVGgTAggkXICwSzgpFSKAgB0FCDs7jgptQgCBhAs4JuwWLwqKfrEggAAC8QjMyE88xdOQB5WpqKgyDvnf9asPOpS/I4AAAvcIpBf6S39j7s3Kniv9vb3m27jW3jnqt+xGp/5ZFp/6Eb7aDVtk3bqNMn9+iUTUz7evXlUj1xqvGOfKy82X9euflbU1tVLkD8jNmzdkeHhY1qxZJ8uXPyEFBX6pCFbJ5cvnZHQ0+mvyU7Zz587XpK+vVzZt3CqPLl8pEXV8Z+dN49jNz74gd+8OSP/4Tz2Xl1caxzQ1NYq/sFhqazeL1+uVLZtflKAK2dbWJlmxYpVs2rRNgsGlRrtCobtTnpedCCCQYAH1s+wjQ0NxV5rzSL5RNqmXsdu/vUt04NXVHZDGxq9UED0vgcACoyGZmT7ZseNV6entlrojByUcCctL278rHo9HLl44K83Njcbr6NH3JRwOP7Dji8rKjSCtrz8u586fVsH1LcnLKzDKBVTQ+nxzo3VkZ8+ToqLAeDsypWrpcinI98uRDw7IyMiwvLJ7j/gys+TQ+/uNgNR1sSCAgLMEkhZ2etZWXDxfDh3eLx0dbdLQcEHOnv0iqlW+uFJ6e3vk1KkTcutWuxw/Xic6hPz+Yukf6JNQKGS8urpuRcs8aOPkZ59Iu5odXrp0TpqarkmlmpVNZwmPjMin9R+pmWCHnD7zuWRkzJETnx6Tzq4OOXPmlBSqNrEggICzBJJ2zy5XhZ2+rNSXruZyu7vL3JQiFYSLFlXInh/9LLovJydX8vMLVTi2R/c9zEZ//9eX5L19PZI5zd+yv3v3TvQ0kXBEXUp/PYUOh0ckzZO0/0dE28EGAghYE0ha2OlZkg48fRlr3u8qWVAabX1vz211L+68HHzvnei+mdoYVYGbqe8tji8Z3jnmJmsEEHCpQNKmKPpS9NKl/8pOdV/uMXWzv3bDZimvWBJlva4eDpSp+2z6wYVecnIekZdfekXmqX+HVi8Dqrx+QKHv4Vldum53SmVltaSnpxuXqNXVK6xWSXkEELC5QNLCTjsc+eCgugd2SooDJer+XLecOHFM7R1butUlbd2RA7Jt6w554/W35LVXX1dPaRuiT0z1rM+XlSVv/vRt40mpWS6e9cmTH4t+SPHjN36pzrNX2tpb4qmGMggg4CABT1V1TfQzHAVFfmlrbrbUfJ+eian7WlMt+mMmV69elm51yaqXTZu2GjOrw4f/OeFwn3oyO6j+7dmpPl6Sph5DF6qPhxSPPz2dUFC90R8xuXDhy8m7p3wfe0k95QHsRACB1AukeyU0/jGxeBpTUho0iiXtnp0+mzcjQ3bt+qG0tFxX9+/yJCsrW97d/9d72h8aDN2zz9yhH3DosmXqYcZUS0R9LGW6YWfeO5yqHvYhgIC7BJI6s9N0+rNu+uMk+omn+aFhd5HSGwQQSKiAE2d2GkDfm9MvFgQQQCCZAkl9QJHMjnEuBBBAIFaAsIvVYBsBBFwrQNi5dmjpGAIIxAoQdrEabCOAgGsFCDvXDi0dQwCBWAHCLlaDbQQQcK0AYefaoaVjCCAQKzAj36Dw8BNIscZsI4CABYHo91kt1KGLMrOzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhgBh54xxopUIIGBRgLCzCEhxBBBwhoA3Fc3sKamS9mVrJZKekYrT3/ecaeFhCVysl9zWhvsewx8QQMCZAimZ2dkx6PTw6fDVbWNBAAH3CaQk7Ow2o4sdVju3LbadbCOAwMMJpCTsHq6JHI0AAghYFyDsrBtSAwIIOECAsHPAINFEBBCwLkDYWTekBgQQcIAAYeeAQaKJCCBgXYCws25IDQgg4AABws4Bg0QTEUDAuoDjwm7Fgnz5RiDPes+pAQEEZpWA48KuujhXlqoXCwIIIPAwArYNu7c3Py47Hy83+pLm8cgnv3hR9Do/K1MeyRz7Tu2aMr/Uv7Vdzu/7juxdW20c++utq+SZJfON7d/tfEp2rw4a2/u2PCFblpYY2/wHAQRmn4Btw+5oww15+bHFxog8ucgvVzp6JTI6KvMyveo1FnZ/3L1Bvv+XY7L6t+/K3qeqJViYI1+2dsmGirGwW1laIM9VLzTq2LhkgXzR3Dn7RpgeI4CAIZCSXz2Zjv3n1ztkWSDXmM29sLxM/n762oRipXnZsnJhodQGx4JNh+A3FxdJ3aUW+cGTVVKm/v7vpltSUZAjakIomd506bozOKEO3iCAwOwRsO3MTg/BR1faRM/q1lcEjBCLHZbsOV5REz0jDPXl7R/+dVHOtt6WzoFBmav+9oyayX14+YY0dvWry9eFcrqFWV2sH9sIzDYB287s9ED848w12VOzVFp67shQODJhbK7c6pWGjh7523+uSt/gsHE/bmBo2DjmQnu3fG9Npez684fGrO5X6v7f7z8+P6E8bxBAYHYJ2Hpm95m6lH1+Wam8o0Jv8hKOjMq+A6ek7s1tcugnW+XnTz8qN/tDxmHHrtwwHmT0hoaN2eHTlfPl+Fdtk6vgPQIIzCIBT1V1jboYHFsKivzS1txsvo1r7Zun7pFFJs7CJld08bk9k3fF/V7fj5ub4ZWBoZG465hccFndnybv4j0CCKRIYDQtTUL9fXGfvaQ0aJS19cxuOr3T9+0SGXTTOSfHIICA8wQcH3bOI6fFCCCQCgHCLhXqnBMBBJIuQNglnZwTIoBAKgQIu1Soc04EEEi6AGGXdHJOiAACqRAg7FKhzjkRQCDpAikJu7Tw2Dcdkt7baZzQzm2bRvM5BAEE7iOQkrALXKwXO4aKbpNuGwsCCLhPICXfjc1tbRD9YkEAAQSSJZCSmV2yOsd5EEAAAVOAsDMlWCOAgKsFCDtXDy+dQwABU4CwMyVYI4CAqwUIO1cPL51DAAFTgLAzJVgjgICrBQg7Vw8vnUMAAVOAsDMlWCOAgKsFCDtXDy+dQwABU4CwMyVYI4CAqwUIO1cPL51DAAFTgLAzJVgjgICrBQg7Vw8vnUMAAVOAsDMlWCOAgKsFCDtXDy+dQwABU4CwMyVYI4CAqwUIO1cPL51DAAFTgLAzJVgjgICrBf4PefA6tQPf+T8AAAAASUVORK5CYII="},65634:function(e,t,n){t.Z=n.p+"assets/images/deploy-option-near-fdbe115f2a885fcaf1f1f6ad4eb2995c.png"},49176:function(e,t,n){t.Z=n.p+"assets/images/deployed-contract-near-7efeed4abf28f4791c3f9d54dac7083e.png"},10844:function(e,t,n){t.Z=n.p+"assets/images/function-call-847ffb3dc6c1386cd8c482602eb68864.png"},25062:function(e,t,n){t.Z=n.p+"assets/images/project-compile-8d1e5eaf8fb296055fc02c6f0cb4825c.png"},44633:function(e,t,n){t.Z=n.p+"assets/images/deploy-near-5064c578366ef3cbf0eb88a7d241e2f7.png"},88577:function(e,t,n){t.Z=n.p+"assets/images/new-project-near-66c80e06b15f523ccd5a53569fbefb89.png"},11509:function(e,t,n){t.Z=n.p+"assets/images/template-code-near-9cb4d704a5d9a66a5b8058a4f7aa8e54.png"}}]); \ No newline at end of file diff --git a/assets/js/eed396f0.0fd2a19b.js b/assets/js/eed396f0.0fd2a19b.js deleted file mode 100644 index 007953d85..000000000 --- a/assets/js/eed396f0.0fd2a19b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[9531],{3905:function(t,e,o){o.d(e,{Zo:function(){return c},kt:function(){return m}});var A=o(67294);function n(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}function a(t,e){var o=Object.keys(t);if(Object.getOwnPropertySymbols){var A=Object.getOwnPropertySymbols(t);e&&(A=A.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),o.push.apply(o,A)}return o}function r(t){for(var e=1;e=0||(n[o]=t[o]);return n}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(A=0;A=0||Object.prototype.propertyIsEnumerable.call(t,o)&&(n[o]=t[o])}return n}var i=A.createContext({}),p=function(t){var e=A.useContext(i),o=e;return t&&(o="function"==typeof t?t(e):r(r({},e),t)),o},c=function(t){var e=p(t.components);return A.createElement(i.Provider,{value:e},t.children)},s={inlineCode:"code",wrapper:function(t){var e=t.children;return A.createElement(A.Fragment,{},e)}},d=A.forwardRef((function(t,e){var o=t.components,n=t.mdxType,a=t.originalType,i=t.parentName,c=l(t,["components","mdxType","originalType","parentName"]),d=p(o),m=n,u=d["".concat(i,".").concat(m)]||d[m]||s[m]||a;return o?A.createElement(u,r(r({ref:e},c),{},{components:o})):A.createElement(u,r({ref:e},c))}));function m(t,e){var o=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var a=o.length,r=new Array(a);r[0]=d;var l={};for(var i in e)hasOwnProperty.call(e,i)&&(l[i]=e[i]);l.originalType=t,l.mdxType="string"==typeof t?t:n,r[1]=l;for(var p=2;p\n \u251c\u2500\u2500 Move.toml\n \u2514\u2500\u2500 sources\n \u2514\u2500\u2500 YOUR_CONTRACT_FILE.move\n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"PROJECT TO COMPILE")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button. Don't forget to write your address in Move.toml"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'[package]\nname = "Examples"\nversion = "0.0.0"\n\n[addresses]\nhello_blockchain = "your address"\n\n[dependencies]\nAptosFramework = { git = "https://github.com/aptos-labs/aptos-core.git", subdir = "aptos-move/framework/aptos-framework/", rev = "aptos-node-v1.2.0" }\n\n')),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a compiled binary file is returned."),(0,a.kt)("img",{src:o(25059).Z,alt:"aptos-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned compiled binary file in ",(0,a.kt)("inlineCode",{parentName:"p"},"aptos//out")," directory."),(0,a.kt)("p",{parentName:"admonition"},"If you need to revise the contract and compile again, delete the ",(0,a.kt)("inlineCode",{parentName:"p"},"out")," directory and click the compile button.")),(0,a.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," to sign the transaction."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:o(83890).Z,title:"Deploy",width:"1802",height:"1758"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),"\n: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:o(25952).Z,title:"Deploy",width:"1768",height:"2002"})),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"There are two ways to import contracts."),(0,a.kt)("ol",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ol"},"Automatically import contracts deployed through the above process."),(0,a.kt)("li",{parentName:"ol"},"Import existing deployed contracts through ",(0,a.kt)("inlineCode",{parentName:"li"},"At Address")," button."))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": You can check the modules and resources owned by the current account, and you can read the resources through the ",(0,a.kt)("inlineCode",{parentName:"p"},"Get Resource")," button."),(0,a.kt)("img",{src:o(49170).Z,alt:"view-aptos",style:{width:"318px"}}),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," is required because the transaction signature and request are required."),(0,a.kt)("img",{src:o(98282).Z,alt:"entry-aptos",style:{width:"500px"}}))}m.isMDXComponent=!0},25059:function(t,e){e.Z="data:image/png;base64,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"},98282:function(t,e,o){e.Z=o.p+"assets/images/entry-aptos-3fb256ecc3e8d6ef9ef37f5a37f5fa00.png"},49170:function(t,e,o){e.Z=o.p+"assets/images/view-aptos-3c614c0885eaf3156e182181894e54eb.png"},83890:function(t,e,o){e.Z=o.p+"assets/images/deploy-aptos-8294285811a4f4ae840a8904925c99f7.png"},25952:function(t,e,o){e.Z=o.p+"assets/images/deployed-contract-aptos-c83f9797b55d61e51f46bee3e1dcdf3e.png"},66351:function(t,e){e.Z="data:image/png;base64,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"},75572:function(t,e,o){e.Z=o.p+"assets/images/template-code-aptos-b60550838f33b8ae7a3d9d3e86daa2f9.png"}}]); \ No newline at end of file diff --git a/assets/js/eed396f0.4cd59d44.js b/assets/js/eed396f0.4cd59d44.js new file mode 100644 index 000000000..d64fdd163 --- /dev/null +++ b/assets/js/eed396f0.4cd59d44.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[9531],{3905:function(t,e,o){o.d(e,{Zo:function(){return c},kt:function(){return m}});var n=o(67294);function A(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}function a(t,e){var o=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),o.push.apply(o,n)}return o}function r(t){for(var e=1;e=0||(A[o]=t[o]);return A}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,o)&&(A[o]=t[o])}return A}var i=n.createContext({}),p=function(t){var e=n.useContext(i),o=e;return t&&(o="function"==typeof t?t(e):r(r({},e),t)),o},c=function(t){var e=p(t.components);return n.createElement(i.Provider,{value:e},t.children)},d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(t,e){var o=t.components,A=t.mdxType,a=t.originalType,i=t.parentName,c=l(t,["components","mdxType","originalType","parentName"]),s=p(o),m=A,u=s["".concat(i,".").concat(m)]||s[m]||d[m]||a;return o?n.createElement(u,r(r({ref:e},c),{},{components:o})):n.createElement(u,r({ref:e},c))}));function m(t,e){var o=arguments,A=e&&e.mdxType;if("string"==typeof t||A){var a=o.length,r=new Array(a);r[0]=s;var l={};for(var i in e)hasOwnProperty.call(e,i)&&(l[i]=e[i]);l.originalType=t,l.mdxType="string"==typeof t?t:A,r[1]=l;for(var p=2;p\n \u251c\u2500\u2500 Move.toml\n \u2514\u2500\u2500 sources\n \u2514\u2500\u2500 YOUR_CONTRACT_FILE.move\n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"PROJECT TO COMPILE")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button. Don't forget to write your address in Move.toml"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre"},'[package]\nname = "Examples"\nversion = "0.0.0"\n\n[addresses]\nhello_blockchain = "your address"\n\n[dependencies]\nAptosFramework = { git = "https://github.com/aptos-labs/aptos-core.git", subdir = "aptos-move/framework/aptos-framework/", rev = "aptos-node-v1.2.0" }\n\n')),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a compiled binary file is returned."),(0,a.kt)("img",{src:o(25059).Z,alt:"aptos-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned compiled binary file in ",(0,a.kt)("inlineCode",{parentName:"p"},"aptos//out")," directory."),(0,a.kt)("p",{parentName:"admonition"},"If you need to revise the contract and compile again, delete the ",(0,a.kt)("inlineCode",{parentName:"p"},"out")," directory and click the compile button.")),(0,a.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," to sign the transaction."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:o(83890).Z,title:"Deploy",width:"1802",height:"1758"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),"\n: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:o(25952).Z,title:"Deploy",width:"1768",height:"2002"})),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"There are two ways to import contracts."),(0,a.kt)("ol",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ol"},"Automatically import contracts deployed through the above process."),(0,a.kt)("li",{parentName:"ol"},"Import existing deployed contracts through ",(0,a.kt)("inlineCode",{parentName:"li"},"At Address")," button."))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": You can check the modules and resources owned by the current account, and you can read the resources through the ",(0,a.kt)("inlineCode",{parentName:"p"},"Get Resource")," button."),(0,a.kt)("img",{src:o(49170).Z,alt:"view-aptos",style:{width:"318px"}}),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," is required because the transaction signature and request are required."),(0,a.kt)("img",{src:o(98282).Z,alt:"entry-aptos",style:{width:"500px"}}))}m.isMDXComponent=!0},25059:function(t,e){e.Z="data:image/png;base64,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"},98282:function(t,e,o){e.Z=o.p+"assets/images/entry-aptos-3fb256ecc3e8d6ef9ef37f5a37f5fa00.png"},49170:function(t,e,o){e.Z=o.p+"assets/images/view-aptos-3c614c0885eaf3156e182181894e54eb.png"},83890:function(t,e,o){e.Z=o.p+"assets/images/deploy-aptos-8294285811a4f4ae840a8904925c99f7.png"},25952:function(t,e,o){e.Z=o.p+"assets/images/deployed-contract-aptos-c83f9797b55d61e51f46bee3e1dcdf3e.png"},66351:function(t,e){e.Z="data:image/png;base64,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"},75572:function(t,e,o){e.Z=o.p+"assets/images/template-code-aptos-b60550838f33b8ae7a3d9d3e86daa2f9.png"}}]); \ No newline at end of file diff --git a/assets/js/fb0e2161.1e334e44.js b/assets/js/fb0e2161.1e334e44.js deleted file mode 100644 index 27db5ba0d..000000000 --- a/assets/js/fb0e2161.1e334e44.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[3894],{3905:function(e,t,n){n.d(t,{Zo:function(){return s},kt:function(){return d}});var o=n(67294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=o.createContext({}),p=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},s=function(e){var t=p(e.components);return o.createElement(c.Provider,{value:t},e.children)},A={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,c=e.parentName,s=r(e,["components","mdxType","originalType","parentName"]),u=p(n),d=i,g=u["".concat(c,".").concat(d)]||u[d]||A[d]||a;return n?o.createElement(g,l(l({ref:t},s),{},{components:n})):o.createElement(g,l({ref:t},s))}));function d(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,l=new Array(a);l[0]=u;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,l[1]=r;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=o.createContext({}),p=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},s=function(e){var t=p(e.components);return o.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,l=e.originalType,c=e.parentName,s=r(e,["components","mdxType","originalType","parentName"]),d=p(n),A=a,g=d["".concat(c,".").concat(A)]||d[A]||u[A]||l;return n?o.createElement(g,i(i({ref:t},s),{},{components:n})):o.createElement(g,i({ref:t},s))}));function A(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=n.length,i=new Array(l);i[0]=d;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:a,i[1]=r;for(var p=2;p=a)&&Object.keys(i.O).every((function(e){return i.O[e](f[d])}))?f.splice(d--,1):(r=!1,a0&&n[b-1][2]>a;b--)n[b]=n[b-1];n[b]=[f,c,a]},i.n=function(e){var f=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(f,{a:f}),f},r=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},i.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);i.r(c);var a={};t=t||[null,r({}),r([]),r(r)];for(var n=2&f&&e;"object"==typeof n&&!~t.indexOf(n);n=r(n))Object.getOwnPropertyNames(n).forEach((function(f){a[f]=function(){return e[f]}}));return a.default=function(){return e},i.d(c,a),c},i.d=function(e,f){for(var c in f)i.o(f,c)&&!i.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:f[c]})},i.f={},i.e=function(e){return Promise.all(Object.keys(i.f).reduce((function(f,c){return i.f[c](e,f),f}),[]))},i.u=function(e){return"assets/js/"+({53:"935f2afb",392:"1305a10c",636:"57b3501e",641:"21e7ee31",1168:"794a490c",1341:"454d1c4b",1517:"9641dabc",1546:"7ab5d839",1578:"c2acac07",1627:"de45733a",1758:"1c572811",1814:"da8f506e",2038:"e3030cff",2068:"4708c571",2100:"cfffcf96",2109:"355029d7",2153:"3904238f",2250:"09d1c6b4",2332:"f51ad52a",2540:"38da68f2",2654:"8000a0c5",2705:"7803f975",3083:"d8744fac",3087:"6df0a58f",3277:"c81eca2d",3523:"99905344",3591:"1c03e8b7",3605:"c1579fab",3648:"543fd3bb",3670:"03b408e4",3760:"5d6b3973",3803:"5a06c145",3894:"fb0e2161",4037:"84224b2b",4176:"9a4ea0d9",4195:"c4f5d8e4",4449:"bf84858a",4458:"522088c9",4492:"691a2c48",4646:"de0762c4",4650:"51a34a56",5141:"8b9d688e",5227:"403d3487",5258:"a718fe41",5297:"43e356bf",5304:"7500b4e0",5328:"54107afb",5370:"88f433ff",5530:"c6c64c1a",5805:"1cf2f6ff",5982:"ad370160",5983:"363b7c43",6183:"00b4c105",6216:"45d4b96f",6395:"7eeac8ca",6473:"594a3b94",6779:"90fc19ed",6783:"fb3ecd3e",6836:"fea1970e",6949:"cf4ea8da",7074:"11a0c2b3",7197:"9f204afa",7239:"da2e1482",7299:"b2a8af1c",7362:"2b9123c9",7369:"3dd32439",7399:"4dcc0d45",7488:"93e8bf3a",7529:"ac8d6fb4",7745:"580fc6fd",7820:"6b0f7fcb",7918:"17896441",7920:"1a4e3797",7989:"e90d2489",8318:"67e240e2",8419:"ce8bece0",8794:"2af05664",8803:"94685147",9074:"5987e775",9210:"c8ea4eae",9275:"c55b56c8",9361:"8e51e284",9514:"1be78505",9531:"eed396f0",9671:"0e384e19",9686:"4bd62d2e",9718:"120df076",9799:"60d77f6c",9845:"8407e836",9964:"f01f444e",9975:"d3aeba4f"}[e]||e)+"."+{53:"5e2cdb53",392:"dcaa00b9",435:"6774149a",636:"01829ad0",641:"81ba0cbd",885:"8c44083a",1168:"18ce5594",1341:"14fb52eb",1517:"6ff784fd",1546:"3e9b9653",1578:"d9a21019",1627:"8fb889d5",1758:"fe5741ea",1789:"10eefc80",1814:"84c364e3",2038:"6bf1cdac",2068:"42891fd9",2100:"514b8f0f",2109:"999aafa9",2153:"e583b284",2250:"4de3d55a",2332:"a2742b4c",2540:"42b06174",2654:"c3bd949d",2705:"68e51cde",3083:"6e4db9c5",3087:"ed23b296",3277:"1f253b34",3523:"7b5b8cd3",3591:"83fa9fae",3605:"d5c7d35b",3648:"526ee614",3664:"03c198a6",3670:"7430ead5",3760:"ee1b03bb",3803:"72afefac",3894:"1e334e44",3979:"7404aa69",4037:"875465f2",4176:"c913f050",4195:"17522630",4204:"ed7c913a",4449:"633fbd2a",4458:"f2b4cd63",4492:"9974169d",4646:"38343e79",4650:"0bf0ace7",5141:"b88aa797",5227:"7d6221fd",5258:"4d82f88a",5297:"a4997c2a",5304:"d33ebc94",5328:"ad8a9d05",5370:"9eaccaac",5381:"8d957526",5530:"41d77573",5536:"38938bc5",5805:"7fffca33",5982:"57e57b9b",5983:"59819270",6183:"ede23c7e",6216:"69ed149d",6395:"4968eb11",6473:"30ac8730",6571:"b4b1dcdd",6779:"d72e986f",6780:"c08f84f1",6783:"846d0426",6836:"d1646ce8",6945:"65120ee6",6949:"865b3f98",7074:"b0236ce7",7197:"15e7c69f",7239:"790d3cd6",7299:"3aed0917",7362:"5151f23d",7369:"fdfe8e61",7399:"e9f3ac12",7452:"f83a4041",7464:"778c49d3",7488:"477c826e",7529:"46fed01a",7647:"f3555774",7670:"adf442ae",7745:"b4475efa",7818:"ca9aed5d",7820:"85411e37",7918:"8c09902c",7920:"73c93701",7989:"b7a044b4",8318:"1b8c2181",8419:"b9c568a3",8794:"ca276d7e",8803:"1cffd38b",9055:"af57c60f",9074:"917eed8e",9210:"7d59a4d0",9275:"7a0b2acd",9361:"ae1bc47c",9435:"15372baa",9514:"7f6de34b",9531:"0fd2a19b",9671:"b921e347",9686:"44bff644",9718:"4ab52e17",9799:"7b7fab39",9845:"b348928b",9958:"0dfe3a93",9964:"2350c810",9975:"16ba30cc"}[e]+".js"},i.miniCssF=function(e){},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=function(e,f){return Object.prototype.hasOwnProperty.call(e,f)},d={},o="welldone-docs:",i.l=function(e,f,c,a){if(d[e])d[e].push(f);else{var n,t;if(void 0!==c)for(var r=document.getElementsByTagName("script"),b=0;b=n)&&Object.keys(i.O).every((function(e){return i.O[e](f[d])}))?f.splice(d--,1):(r=!1,n0&&a[b-1][2]>n;b--)a[b]=a[b-1];a[b]=[f,c,n]},i.n=function(e){var f=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(f,{a:f}),f},r=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},i.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);i.r(c);var n={};t=t||[null,r({}),r([]),r(r)];for(var a=2&f&&e;"object"==typeof a&&!~t.indexOf(a);a=r(a))Object.getOwnPropertyNames(a).forEach((function(f){n[f]=function(){return e[f]}}));return n.default=function(){return e},i.d(c,n),c},i.d=function(e,f){for(var c in f)i.o(f,c)&&!i.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:f[c]})},i.f={},i.e=function(e){return Promise.all(Object.keys(i.f).reduce((function(f,c){return i.f[c](e,f),f}),[]))},i.u=function(e){return"assets/js/"+({53:"935f2afb",392:"1305a10c",636:"57b3501e",641:"21e7ee31",1168:"794a490c",1341:"454d1c4b",1517:"9641dabc",1546:"7ab5d839",1578:"c2acac07",1627:"de45733a",1758:"1c572811",1814:"da8f506e",2038:"e3030cff",2068:"4708c571",2100:"cfffcf96",2109:"355029d7",2153:"3904238f",2250:"09d1c6b4",2332:"f51ad52a",2540:"38da68f2",2654:"8000a0c5",2705:"7803f975",3083:"d8744fac",3087:"6df0a58f",3277:"c81eca2d",3523:"99905344",3591:"1c03e8b7",3605:"c1579fab",3648:"543fd3bb",3670:"03b408e4",3760:"5d6b3973",3803:"5a06c145",3894:"fb0e2161",4037:"84224b2b",4176:"9a4ea0d9",4195:"c4f5d8e4",4449:"bf84858a",4458:"522088c9",4492:"691a2c48",4646:"de0762c4",4650:"51a34a56",5141:"8b9d688e",5227:"403d3487",5258:"a718fe41",5297:"43e356bf",5304:"7500b4e0",5328:"54107afb",5370:"88f433ff",5530:"c6c64c1a",5805:"1cf2f6ff",5982:"ad370160",5983:"363b7c43",6183:"00b4c105",6216:"45d4b96f",6395:"7eeac8ca",6473:"594a3b94",6779:"90fc19ed",6783:"fb3ecd3e",6836:"fea1970e",6949:"cf4ea8da",7074:"11a0c2b3",7197:"9f204afa",7239:"da2e1482",7299:"b2a8af1c",7362:"2b9123c9",7369:"3dd32439",7399:"4dcc0d45",7488:"93e8bf3a",7529:"ac8d6fb4",7745:"580fc6fd",7820:"6b0f7fcb",7918:"17896441",7920:"1a4e3797",7989:"e90d2489",8318:"67e240e2",8419:"ce8bece0",8794:"2af05664",8803:"94685147",9074:"5987e775",9210:"c8ea4eae",9275:"c55b56c8",9361:"8e51e284",9514:"1be78505",9531:"eed396f0",9671:"0e384e19",9686:"4bd62d2e",9718:"120df076",9799:"60d77f6c",9845:"8407e836",9964:"f01f444e",9975:"d3aeba4f"}[e]||e)+"."+{53:"5e2cdb53",392:"dcaa00b9",435:"6774149a",636:"01829ad0",641:"81ba0cbd",885:"8c44083a",1168:"18ce5594",1341:"14fb52eb",1517:"6ff784fd",1546:"3e9b9653",1578:"d9a21019",1627:"8fb889d5",1758:"fe5741ea",1789:"10eefc80",1814:"84c364e3",2038:"6bf1cdac",2068:"42891fd9",2100:"514b8f0f",2109:"999aafa9",2153:"e583b284",2250:"4de3d55a",2332:"a2742b4c",2540:"42b06174",2654:"c3bd949d",2705:"68e51cde",3083:"e1b46891",3087:"ed23b296",3277:"1f253b34",3523:"7b5b8cd3",3591:"83fa9fae",3605:"d5c7d35b",3648:"526ee614",3664:"03c198a6",3670:"7430ead5",3760:"ee1b03bb",3803:"72afefac",3894:"f1865e19",3979:"7404aa69",4037:"875465f2",4176:"c913f050",4195:"17522630",4204:"ed7c913a",4449:"633fbd2a",4458:"f2b4cd63",4492:"9974169d",4646:"38343e79",4650:"0bf0ace7",5141:"b88aa797",5227:"7d6221fd",5258:"4d82f88a",5297:"a4997c2a",5304:"d33ebc94",5328:"ad8a9d05",5370:"9eaccaac",5381:"8d957526",5530:"41d77573",5536:"38938bc5",5805:"7fffca33",5982:"57e57b9b",5983:"c3c8d047",6183:"ede23c7e",6216:"77531d3f",6395:"4968eb11",6473:"30ac8730",6571:"b4b1dcdd",6779:"d72e986f",6780:"c08f84f1",6783:"846d0426",6836:"d1646ce8",6945:"65120ee6",6949:"865b3f98",7074:"b0236ce7",7197:"15e7c69f",7239:"790d3cd6",7299:"3aed0917",7362:"26b26bfa",7369:"fdfe8e61",7399:"e9f3ac12",7452:"f83a4041",7464:"778c49d3",7488:"477c826e",7529:"46fed01a",7647:"f3555774",7670:"adf442ae",7745:"b4475efa",7818:"ca9aed5d",7820:"85411e37",7918:"8c09902c",7920:"73c93701",7989:"b7a044b4",8318:"1b8c2181",8419:"b9c568a3",8794:"ca276d7e",8803:"1cffd38b",9055:"af57c60f",9074:"917eed8e",9210:"7d59a4d0",9275:"7a0b2acd",9361:"ae1bc47c",9435:"15372baa",9514:"7f6de34b",9531:"4cd59d44",9671:"b921e347",9686:"44bff644",9718:"4ab52e17",9799:"7b7fab39",9845:"b348928b",9958:"0dfe3a93",9964:"2350c810",9975:"16ba30cc"}[e]+".js"},i.miniCssF=function(e){},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=function(e,f){return Object.prototype.hasOwnProperty.call(e,f)},d={},o="welldone-docs:",i.l=function(e,f,c,n){if(d[e])d[e].push(f);else{var a,t;if(void 0!==c)for(var r=document.getElementsByTagName("script"),b=0;b - +
    -

    Aptos

    Create the Project

    In Aptos, you can write smart contracts with Move language. WELLDONE Code provides two features to help developers new to Aptos and Move.

    Create Template

    Create a simple example contract code written in Move. You can create a sample contract by selecting the template option and clicking the Create button.

    template-code-aptos

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    new-project-aptos

    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory aptos/. If you start a new project, the structure should look like the following.

    aptos
    └── <YOUR_PROJECT_NAME>
    ├── Move.toml
    └── sources
    └── YOUR_CONTRACT_FILE.move

    Compile the Contract

    Step 1: Select the project you want to compile in the PROJECT TO COMPILE section.

    Step 2: Click the Compile button. Don't forget to write your address in Move.toml

    [package]
    name = "Examples"
    version = "0.0.0"

    [addresses]
    hello_blockchain = "your address"

    [dependencies]
    AptosFramework = { git = "https://github.com/aptos-labs/aptos-core.git", subdir = "aptos-move/framework/aptos-framework/", rev = "aptos-node-v1.2.0" }

    Step 3: When the compilation is complete, a compiled binary file is returned.

    aptos-compile
    note

    You can check the returned compiled binary file in aptos/<YOUR_PROJECT_NAME>/out directory.

    If you need to revise the contract and compile again, delete the out directory and click the compile button.

    Deploy the Contract

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Click the Send button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 3 -: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    Deploy

    Execute the Contract

    info

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: You can check the modules and resources owned by the current account, and you can read the resources through the Get Resource button.

    view-aptos

    Step 2: You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the WELLDONE Wallet is required because the transaction signature and request are required.

    entry-aptos
    - +

    Aptos

    Connect to WELLDONE Code

    You can activate the WELLDONE Code plugin by accessing this deep link: WELLDONE Code Remix Plugin.

    Create the Project

    In Aptos, you can write smart contracts with Move language. WELLDONE Code provides two features to help developers new to Aptos and Move.

    Create Template

    Create a simple example contract code written in Move. You can create a sample contract by selecting the template option and clicking the Create button.

    template-code-aptos

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    new-project-aptos

    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory aptos/. If you start a new project, the structure should look like the following.

    aptos
    └── <YOUR_PROJECT_NAME>
    ├── Move.toml
    └── sources
    └── YOUR_CONTRACT_FILE.move

    Compile the Contract

    Step 1: Select the project you want to compile in the PROJECT TO COMPILE section.

    Step 2: Click the Compile button. Don't forget to write your address in Move.toml

    [package]
    name = "Examples"
    version = "0.0.0"

    [addresses]
    hello_blockchain = "your address"

    [dependencies]
    AptosFramework = { git = "https://github.com/aptos-labs/aptos-core.git", subdir = "aptos-move/framework/aptos-framework/", rev = "aptos-node-v1.2.0" }

    Step 3: When the compilation is complete, a compiled binary file is returned.

    aptos-compile
    note

    You can check the returned compiled binary file in aptos/<YOUR_PROJECT_NAME>/out directory.

    If you need to revise the contract and compile again, delete the out directory and click the compile button.

    Deploy the Contract

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Click the Send button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 3 +: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    Deploy

    Execute the Contract

    info

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: You can check the modules and resources owned by the current account, and you can read the resources through the Get Resource button.

    view-aptos

    Step 2: You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the WELLDONE Wallet is required because the transaction signature and request are required.

    entry-aptos
    + \ No newline at end of file diff --git a/code/deploy-and-run/celo/index.html b/code/deploy-and-run/celo/index.html index 76055f69f..4618f04fa 100644 --- a/code/deploy-and-run/celo/index.html +++ b/code/deploy-and-run/celo/index.html @@ -8,13 +8,13 @@ - +

    Celo

    Create the Project

    Step 1: When writing a smart contract in Celo, write a contract with Solidity like Ethereum.

    Step 2: Select a contract file you have written.

    Select Project

    Compile the Contract

    Step 1: If you select a contract file you want to compile, then Compile button will be activated.

    Step 2: Click the Compile button.

    Project Compile

    Deploy the Contract

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Click the Deploy button and click the Send Tx button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 3: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    Tx Success Log

    deployed-contract-celo

    Execute the Contract

    info

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 3: Run the method via clicking call or transaction button. If you are sending a transaction, you must sign the transaction by clicking the Send Tx button in the WELLDONE Wallet.

    Deployed Contract

    - + \ No newline at end of file diff --git a/code/deploy-and-run/index.html b/code/deploy-and-run/index.html index 61e5fc674..4786ef237 100644 --- a/code/deploy-and-run/index.html +++ b/code/deploy-and-run/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/code/deploy-and-run/juno/index.html b/code/deploy-and-run/juno/index.html index 6152992de..f72ca0bba 100644 --- a/code/deploy-and-run/juno/index.html +++ b/code/deploy-and-run/juno/index.html @@ -8,13 +8,13 @@ - +
    -

    Juno

    info

    Please refer to here to get started.

    Create the Project

    In Juno, you can write smart contracts with Rust language. WELLDONE Code provides two features to help developers new to Juno.

    Create Template

    Create a simple example contract code written in Rust. You can create a sample contract by selecting the template option and clicking the Create button. More templates may be found at Juno Samples.

    template-code-juno

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory juno/. If you start a new project, the structure should look like the following.

    Writing Contracts in Rust

    juno
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── contract.rs
    └── examples
    └── schema.rs

    Compile the Contract

    info

    We now only support the AMD compilation server.

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm and schema files are returned.

    juno-compile
    note

    You can check the returned wasm file and schema files in juno/<YOUR_PROJECT_NAME>/artifacts and juno/<YOUR_PROJECT_NAME>/schema.

    If you need to revise the contract and compile again, delete the artifacts, schema directory and click the compile button.

    Store Code

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Store Code button will be activated.

    Step 2: Gas price is set to 0.025 ujuno/ujunox as a default and can be modified.

    Step 3: Click the Store Code button.

    juno-store-code

    Instantiate the Contract

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: If there are arguments for contract instantiation, input the parameters and click the Instantiate button. The arguments are generated through react-jsonschema-form.

    juno-instantiate

    Execute the Contract

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 4: Run the method via clicking Query or Execute button. If you are sending a transaction, you must sign the transaction by clicking the Send button in the WELLDONE Wallet.

    juno-execute
    - +

    Juno

    info

    Please refer to here to get started.

    Connect to WELLDONE Code

    You can activate the WELLDONE Code plugin by accessing this deep link: WELLDONE Code Remix Plugin.

    Create the Project

    In Juno, you can write smart contracts with Rust language. WELLDONE Code provides two features to help developers new to Juno.

    Create Template

    Create a simple example contract code written in Rust. You can create a sample contract by selecting the template option and clicking the Create button. More templates may be found at Juno Samples.

    template-code-juno

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory juno/. If you start a new project, the structure should look like the following.

    Writing Contracts in Rust

    juno
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── contract.rs
    └── examples
    └── schema.rs

    Compile the Contract

    info

    We now only support the AMD compilation server.

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm and schema files are returned.

    juno-compile
    note

    You can check the returned wasm file and schema files in juno/<YOUR_PROJECT_NAME>/artifacts and juno/<YOUR_PROJECT_NAME>/schema.

    If you need to revise the contract and compile again, delete the artifacts, schema directory and click the compile button.

    Store Code

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Store Code button will be activated.

    Step 2: Gas price is set to 0.025 ujuno/ujunox as a default and can be modified.

    Step 3: Click the Store Code button.

    juno-store-code

    Instantiate the Contract

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: If there are arguments for contract instantiation, input the parameters and click the Instantiate button. The arguments are generated through react-jsonschema-form.

    juno-instantiate

    Execute the Contract

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 4: Run the method via clicking Query or Execute button. If you are sending a transaction, you must sign the transaction by clicking the Send button in the WELLDONE Wallet.

    juno-execute
    + \ No newline at end of file diff --git a/code/deploy-and-run/klaytn/index.html b/code/deploy-and-run/klaytn/index.html index d32a701e7..76f80c927 100644 --- a/code/deploy-and-run/klaytn/index.html +++ b/code/deploy-and-run/klaytn/index.html @@ -8,13 +8,13 @@ - +

    Klaytn

    Create the Project

    Step 1: When writing a smart contract in Klaytn, write a contract with Solidity like Ethereum.

    Step 2: Select a contract file you have written.

    Select Project

    Compile the Contract

    Step 1: If you select a contract file you want to compile, then Compile button will be activated.

    Step 2: Click the Compile button.

    Project Compile

    Deploy the Contract

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Click the Deploy button and click the Send Tx button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 3: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    Tx Success Log

    deployed-contract-klaytn

    Execute the Contract

    info

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 3: Run the method via clicking call or transaction button. If you are sending a transaction, you must sign the transaction by clicking the Send Tx button in the WELLDONE Wallet.

    Deployed Contract

    - + \ No newline at end of file diff --git a/code/deploy-and-run/near/index.html b/code/deploy-and-run/near/index.html index 3c9b2adb2..f3429929e 100644 --- a/code/deploy-and-run/near/index.html +++ b/code/deploy-and-run/near/index.html @@ -8,13 +8,13 @@ - +
    -

    NEAR

    Create the Project

    In NEAR, you can write smart contracts with AssemblyScript, Rust, JavaScript, and TypeScript. Because the structure of the contract is different in each language, WELLDONE Code provides two features to help developers new to NEAR.

    Create Template

    Create a simple example contract code written in AssemblyScript, Rust, JavaScript, and TypeScript. You can create a sample contract by selecting the template option and clicking the Create a Template button. More templates may be found at NEAR Samples.

    template-code-near

    New Project

    Automatically generate a contract structure based on the smart contract language you want to use. Select the language option, write a name for the project, and click the New Project button to create a contract structure that is appropriate for the language.

    new-project-near

    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory near/. If you start a new project, the structure should look like the following.

    1. Writing Contracts in Rust

    near
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── lib.rs

    2. Writing Contracts in AssemblyScript

    near
    └── <YOUR_PROJECT_NAME>
    └── assembly
    ├── as_types.d.ts
    ├── index.ts
    └── tsconfig.json

    3. Writing Contracts in TypeScript

    near
    └── <YOUR_PROJECT_NAME>
    ├── package.json
    ├── babel.config.json
    ├── tsconfig.json
    └── src
    └── contract.ts

    4. Writing Contracts in JavaScript

    near
    └── <YOUR_PROJECT_NAME>
    ├── package.json
    ├── babel.config.json
    └── src
    └── contract.js

    Compile the Contract

    info

    Six compilation options are now available in WELLDONE Code: Rust, CARGO-NEAR, EMBED-ABI, AssemblyScript, JavaScript, and TypeScript.

    We now only support the AMD compilation server, however, we will shortly add support for the ARM compilation server.

    Step 1: Select the project you want to compile in the PROJECT TO COMPILE section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm file is returned.

    near-compile
    note

    You can check the returned wasm file in near/<YOUR_PROJECT_NAME>/out directory.

    If you need to revise the contract and compile again, delete the out directory and click the compile button.

    1. Rust Compile

    Using the cargo build command to compile a smart contract written in Rust. Although it offers a stable compile, it is inconvenient to enter the method's parameters directly when executing the contract.

    2. CARGO-NEAR Compile (for Rust) - Experimental

    Compile using cargo near which is officially being developed by NEAR. If Compile is successful, an executable wasm binary file and a json file containing the ABI of the contract are created together. If you have deployed and imported a compiled contract using cargo-near, you can find out the parameter type of the method, making it easier to run the contract.

    However, because this feature is still under development, the near-sdk-rs version must be specified at 4.1.0 or higher in the Cargo.toml file, and unexpected issues may occur during compilation. Please check out the NEAR's repository for more detail.

    3. EMBED-ABI Compile (for Rust) - Experimental

    When using -embed-abi option in cargo-near, generates a wasm file containing ABI inside. For contracts that have deployed the wasm file compiling with this option, you can get ABI information even when importing the contract through At Address button. See the cargo-near repository for a detailed description of the options.

    4. AssemblyScript Compile

    Using asbuild to compile a smart contract written in AssemblyScript. The compiler provides a stable compiling.

    5. JavaScript & TypeScript Compile

    Using near-sdk-js to compile a smart contract written in JavaScript or TypeScript.

    note

    If you are using JavaScript or TypeScript compile options, you must write the name of the contract file you want to compile as follows to ensure that the compilation runs without error.

    • JavaScript: contract.js
    • TypeScript: contract.ts

    Deploy the Contract

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Enter the Account ID for which you want to deployed the contract and click the Deploy button. If you want to add init function, click Deploy Option to add the method name and arguments.

    deploy-option-near

    Step 3: If the AccountId already has a deployed contract, confirm once more.

    Step 4: Click the Send Tx button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 5: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    deployed-contract-near

    Execute the Contract

    info

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 3: In the case of the Call function, You can specify the number of NEAR tokens to attach to a function call and the GAS LIMIT.

    Step 4: Run the method via clicking View or Call button. If you are sending a transaction, you must sign the transaction by clicking the Send Tx button in the WELLDONE Wallet.

    function-call
    info

    If you deployed the compiled contract using CARGO-NEAR or EMBED-ABI options, you can execute the contract more easily using the ABI without directly entering the parameters of the method.

    cargo-nearcargo-near1cargo-near2
    - +

    NEAR

    Connect to WELLDONE Code

    You can activate the WELLDONE Code plugin by accessing this deep link: WELLDONE Code Remix Plugin.

    Create the Project

    In NEAR, you can write smart contracts with AssemblyScript, Rust, JavaScript, and TypeScript. Because the structure of the contract is different in each language, WELLDONE Code provides two features to help developers new to NEAR.

    Create Template

    Create a simple example contract code written in AssemblyScript, Rust, JavaScript, and TypeScript. You can create a sample contract by selecting the template option and clicking the Create a Template button. More templates may be found at NEAR Samples.

    template-code-near

    New Project

    Automatically generate a contract structure based on the smart contract language you want to use. Select the language option, write a name for the project, and click the New Project button to create a contract structure that is appropriate for the language.

    new-project-near

    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory near/. If you start a new project, the structure should look like the following.

    1. Writing Contracts in Rust

    near
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── lib.rs

    2. Writing Contracts in AssemblyScript

    near
    └── <YOUR_PROJECT_NAME>
    └── assembly
    ├── as_types.d.ts
    ├── index.ts
    └── tsconfig.json

    3. Writing Contracts in TypeScript

    near
    └── <YOUR_PROJECT_NAME>
    ├── package.json
    ├── babel.config.json
    ├── tsconfig.json
    └── src
    └── contract.ts

    4. Writing Contracts in JavaScript

    near
    └── <YOUR_PROJECT_NAME>
    ├── package.json
    ├── babel.config.json
    └── src
    └── contract.js

    Compile the Contract

    info

    Six compilation options are now available in WELLDONE Code: Rust, CARGO-NEAR, EMBED-ABI, AssemblyScript, JavaScript, and TypeScript.

    We now only support the AMD compilation server, however, we will shortly add support for the ARM compilation server.

    Step 1: Select the project you want to compile in the PROJECT TO COMPILE section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm file is returned.

    near-compile
    note

    You can check the returned wasm file in near/<YOUR_PROJECT_NAME>/out directory.

    If you need to revise the contract and compile again, delete the out directory and click the compile button.

    1. Rust Compile

    Using the cargo build command to compile a smart contract written in Rust. Although it offers a stable compile, it is inconvenient to enter the method's parameters directly when executing the contract.

    2. CARGO-NEAR Compile (for Rust) - Experimental

    Compile using cargo near which is officially being developed by NEAR. If Compile is successful, an executable wasm binary file and a json file containing the ABI of the contract are created together. If you have deployed and imported a compiled contract using cargo-near, you can find out the parameter type of the method, making it easier to run the contract.

    However, because this feature is still under development, the near-sdk-rs version must be specified at 4.1.0 or higher in the Cargo.toml file, and unexpected issues may occur during compilation. Please check out the NEAR's repository for more detail.

    3. EMBED-ABI Compile (for Rust) - Experimental

    When using -embed-abi option in cargo-near, generates a wasm file containing ABI inside. For contracts that have deployed the wasm file compiling with this option, you can get ABI information even when importing the contract through At Address button. See the cargo-near repository for a detailed description of the options.

    4. AssemblyScript Compile

    Using asbuild to compile a smart contract written in AssemblyScript. The compiler provides a stable compiling.

    5. JavaScript & TypeScript Compile

    Using near-sdk-js to compile a smart contract written in JavaScript or TypeScript.

    note

    If you are using JavaScript or TypeScript compile options, you must write the name of the contract file you want to compile as follows to ensure that the compilation runs without error.

    • JavaScript: contract.js
    • TypeScript: contract.ts

    Deploy the Contract

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Enter the Account ID for which you want to deployed the contract and click the Deploy button. If you want to add init function, click Deploy Option to add the method name and arguments.

    deploy-option-near

    Step 3: If the AccountId already has a deployed contract, confirm once more.

    Step 4: Click the Send Tx button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 5: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    deployed-contract-near

    Execute the Contract

    info

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 3: In the case of the Call function, You can specify the number of NEAR tokens to attach to a function call and the GAS LIMIT.

    Step 4: Run the method via clicking View or Call button. If you are sending a transaction, you must sign the transaction by clicking the Send Tx button in the WELLDONE Wallet.

    function-call
    info

    If you deployed the compiled contract using CARGO-NEAR or EMBED-ABI options, you can execute the contract more easily using the ABI without directly entering the parameters of the method.

    cargo-nearcargo-near1cargo-near2
    + \ No newline at end of file diff --git a/code/deploy-and-run/neutron/index.html b/code/deploy-and-run/neutron/index.html index bc328c0a2..1e52faf17 100644 --- a/code/deploy-and-run/neutron/index.html +++ b/code/deploy-and-run/neutron/index.html @@ -8,13 +8,13 @@ - +
    -

    Neutron

    info

    Please refer to here to get started.

    Create the Project

    In Neutron, you can write smart contracts with Rust language. WELLDONE Code provides two features to help developers new to Neutron.

    Create Template

    Create a simple example contract code written in Rust. You can create a sample contract by selecting the template option and clicking the Create button. More templates may be found at Neutron Samples.

    template-code-neutron

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory neutron/. If you start a new project, the structure should look like the following.

    Writing Contracts in Rust

    neutron
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── contract.rs
    └── examples
    └── schema.rs

    Compile the Contract

    info

    We now only support the AMD compilation server. The build environment is crucial for contract verification due to the non-deterministic nature of building Rust into Wasm.

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm and schema files are returned.

    neutron-compile
    note

    You can check the returned wasm file and schema files in neutron/<YOUR_PROJECT_NAME>/artifacts and neutron/<YOUR_PROJECT_NAME>/schema.

    When you run the recompilation, the existing artifacts and schema folders will be deleted and the compilation process will start anew.

    Store Code

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Store Code button will be activated.

    Step 2: Gas price is set to 0.025 untrn/untrnx as a default and can be modified.

    Step 3: Click the Store Code button.

    neutron-store-code

    Instantiate the Contract

    note

    You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: You can choose whether to allow contract upgrades or make them unmodifiable through the immutable option.

    Step 3: If there are arguments for contract instantiation, input the parameters and click the Instantiate button. The arguments are generated through react-jsonschema-form.

    neutron-instantiate

    Execute the Contract

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 4: Run the method via clicking Query or Execute button. If you are sending a transaction, you must sign the transaction by clicking the Send button in the WELLDONE Wallet.

    neutron-execute

    Migrate the Contract

    note

    You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: Select the method as migrate.

    Step 3: Enter the target contract address for the migration and click the Migrate button.

    neutron-migrate
    - +

    Neutron

    info

    Please refer to here to get started.

    Connect to WELLDONE Code

    You can activate the WELLDONE Code plugin by accessing this deep link: WELLDONE Code Remix Plugin.

    Create the Project

    In Neutron, you can write smart contracts with Rust language. WELLDONE Code provides two features to help developers new to Neutron.

    Create Template

    Create a simple example contract code written in Rust. You can create a sample contract by selecting the template option and clicking the Create button. More templates may be found at Neutron Samples.

    template-code-neutron

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory neutron/. If you start a new project, the structure should look like the following.

    Writing Contracts in Rust

    neutron
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── contract.rs
    └── examples
    └── schema.rs

    Compile the Contract

    info

    We now only support the AMD compilation server. The build environment is crucial for contract verification due to the non-deterministic nature of building Rust into Wasm.

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm and schema files are returned.

    neutron-compile
    note

    You can check the returned wasm file and schema files in neutron/<YOUR_PROJECT_NAME>/artifacts and neutron/<YOUR_PROJECT_NAME>/schema.

    When you run the recompilation, the existing artifacts and schema folders will be deleted and the compilation process will start anew.

    Store Code

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Store Code button will be activated.

    Step 2: Gas price is set to 0.025 untrn/untrnx as a default and can be modified.

    Step 3: Click the Store Code button.

    neutron-store-code

    Instantiate the Contract

    note

    You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: You can choose whether to allow contract upgrades or make them unmodifiable through the immutable option.

    Step 3: If there are arguments for contract instantiation, input the parameters and click the Instantiate button. The arguments are generated through react-jsonschema-form.

    neutron-instantiate

    Execute the Contract

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 4: Run the method via clicking Query or Execute button. If you are sending a transaction, you must sign the transaction by clicking the Send button in the WELLDONE Wallet.

    neutron-execute

    Migrate the Contract

    note

    You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: Select the method as migrate.

    Step 3: Enter the target contract address for the migration and click the Migrate button.

    neutron-migrate
    + \ No newline at end of file diff --git a/code/deploy-and-run/sui/index.html b/code/deploy-and-run/sui/index.html index abde7ea45..368cb098a 100644 --- a/code/deploy-and-run/sui/index.html +++ b/code/deploy-and-run/sui/index.html @@ -8,14 +8,14 @@ - +
    -

    Sui

    info

    Please refer to here to get started.

    Create the Project

    In Sui, you can write smart contracts with Move language. WELLDONE Code provides two features to help developers new to Sui and Move.

    Create Template

    Create a simple example contract code written in Move. You can create a sample contract by selecting the template option and clicking the Create button.

    template-code-sui

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    template-code-sui
    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory sui/. If you start a new project, the structure should look like the following.

    sui
    └── <YOUR_PROJECT_NAME>
    ├── Move.toml
    ├── Move.lock
    └── sources
    └── YOUR_CONTRACT_FILE.move

    Compile the Contract

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Click the Compile button.

    Step 3: When the compilation is complete, a compiled binary file is returned.

    sui-compile
    note

    You can check the returned compiled binary file in sui/<YOUR_PROJECT_NAME>/out directory.

    Deploy the Contract

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Click the Send button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 3 -: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    Deploy

    Execute the Contract

    info

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: You can check the Packages, and Modules owned by the current account, and you can read the Objects through the Query Object button.

    Step 2: You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the WELLDONE Wallet is required because the transaction signature and request are required.

    entry-sui
    - +

    Sui

    info

    Please refer to here to get started.

    Connect to WELLDONE Code

    You can activate the WELLDONE Code plugin by accessing this deep link: WELLDONE Code Remix Plugin.

    Create the Project

    In Sui, you can write smart contracts with Move language. WELLDONE Code provides two features to help developers new to Sui and Move.

    Create Template

    Create a simple example contract code written in Move. You can create a sample contract by selecting the template option and clicking the Create button.

    template-code-sui

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    template-code-sui
    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory sui/. If you start a new project, the structure should look like the following.

    sui
    └── <YOUR_PROJECT_NAME>
    ├── Move.toml
    ├── Move.lock
    └── sources
    └── YOUR_CONTRACT_FILE.move

    Compile the Contract

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Click the Compile button.

    Step 3: When the compilation is complete, a compiled binary file is returned.

    sui-compile
    note

    You can check the returned compiled binary file in sui/<YOUR_PROJECT_NAME>/out directory.

    Deploy the Contract

    tip

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Click the Send button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 3 +: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    Deploy

    Execute the Contract

    info

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: You can check the Packages, and Modules owned by the current account, and you can read the Objects through the Query Object button.

    Step 2: You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the WELLDONE Wallet is required because the transaction signature and request are required.

    entry-sui
    + \ No newline at end of file diff --git a/code/getting-started/index.html b/code/getting-started/index.html index 729c70a64..8def468e3 100644 --- a/code/getting-started/index.html +++ b/code/getting-started/index.html @@ -8,15 +8,15 @@ - +
    -

    Getting Started

    Connect to WELLDONE Code

    WELLDONE Code is the official Remix IDE Plug-in. Please visit the Remix IDE and follow the guide below.

    Step 1: Click Plugin Manager button in the left bar.

    Plugin Manager

    Step 2: Search for CODE BY WELLDONE STUDIO and click the Activate button.

    Activate Plugin

    If the plug-in has been successfully added, you can run the WELLDONE Code by clicking the icon shown in the left bar.

    Select a Chain

    Below is a screenshot of WELLDONE Code's main screen. Choose the chain you want to develop the contract with from the Select a Chain section.

    If you click the Documentation button, go to WELLDONE Docs, and if you find a problem or have any questions while using it, click the Make an issue button to go to the Github Repository and feel free to create an issue.

    Select Chain

    Connect to WELLDONE Wallet

    After choosing a chain, click the Connect to WELLDONE button to connect to the WELLDONE Wallet in order to use the WELLDONE Code.

    The error Install WELLDONE Wallet will appear if the WELLDONE Wallet is not installed, and the error Unlock your WELLDONE Wallet OR Create Account will apear if the WELLDONE Wallet is installed but the wallet is locked or no account in the chain is created.

    Connect Wallet Install Error +

    Getting Started

    Connect to WELLDONE Code

    WELLDONE Code is the official Remix IDE Plug-in. Please visit the Remix IDE and follow the guide below.

    Step 1: Click Plugin Manager button in the left bar.

    Plugin Manager

    Step 2: Search for CODE BY WELLDONE STUDIO and click the Activate button.

    Activate Plugin

    If the plug-in has been successfully added, you can run the WELLDONE Code by clicking the icon shown in the left bar.

    Select a Chain

    Below is a screenshot of WELLDONE Code's main screen. Choose the chain you want to develop the contract with from the Select a Chain section.

    If you click the Documentation button, go to WELLDONE Docs, and if you find a problem or have any questions while using it, click the Make an issue button to go to the Github Repository and feel free to create an issue.

    Select Chain

    Connect to Wallet

    Supported Wallets by Chain

    Refer to the table below for the chains and their supported wallets:

    ChainSupported Wallets
    NeutronKeplr Wallet, WELLDONE Wallet

    Note: We plan to add more wallets for other chains, so keep an eye on plugin updates for the latest supported wallets.

    Connect to WELLDONE Wallet

    After choosing a chain, click the Connect to WELLDONE button to connect to the WELLDONE Wallet in order to use the WELLDONE Code.

    The error Install WELLDONE Wallet will appear if the WELLDONE Wallet is not installed, and the error Unlock your WELLDONE Wallet OR Create Account will apear if the WELLDONE Wallet is installed but the wallet is locked or no account in the chain is created.

    Connect Wallet Install Error Connect Wallet Locked

    If you haven't installed the WELLDONE Wallet yet, please follow the following manual to install and create a wallet and create an account for the selected chain. -Finally, go into the Setting tab of your wallet and activate Developer Mode.

    Developer Mode

    And you must click the Refresh button in the upper right corner of the plug-in to apply changes to your wallet. If you successfully connect to the WELLDONE Wallet, the name and token balance of the linked account will be displayed in the plug-in.

    Connect Wallet

    Please refer to the next section for instructions on how to use the WELLDONE Code by chain.


    - +Finally, go into the Setting tab of your wallet and activate Developer Mode.

    Developer Mode

    And you must click the Refresh button in the upper right corner of the plug-in to apply changes to your wallet. If you successfully connect to the WELLDONE Wallet, the name and token balance of the linked account will be displayed in the plug-in.

    Connect Wallet

    Please refer to the next section for instructions on how to use the WELLDONE Code by chain.


    + \ No newline at end of file diff --git a/code/index.html b/code/index.html index d8ba48044..2746dbc76 100644 --- a/code/index.html +++ b/code/index.html @@ -8,13 +8,13 @@ - +

    Code

    Since the smart contract development environment differs from networks, developers must reconstruct the development environment whenever the targeted network changes. It puts a lot of pressure on Web3 voyagers who are trying to navigate the new chain. As a result, WELLDONE Studio now offers WELLDONE Code, which allows developers who want to navigate the multi-chain to focus entirely on developing and testing smart contracts without having to worry about the complex development environment.

    WELLDONE Code is a Remix IDE Plugin. Remix is a web-based Integrated Development Environment (IDE) for the Solidity programming language, which is used to write smart contracts for the Ethereum blockchain. Remix allows developers to write, test, and debug EVM-based smart contracts in a convenient and user-friendly interface. Using WELLDONE Code, developers can easily develop and test smart contracts in Remix IDE for non-EVM networks such as NEAR and Cosmos, in addition to EVM-compatible networks.

    WELLDONE Code is a wonderful tool for onboarding developers in any blockchain ecosystem since it allows them to write smart contracts without the need for building a separate development environment.

    Start a multi-chain voyage with the WELLDONE Code!

    - + \ No newline at end of file diff --git a/code/verification-api/cosmwasm/index.html b/code/verification-api/cosmwasm/index.html index cc61b0eb3..718419580 100644 --- a/code/verification-api/cosmwasm/index.html +++ b/code/verification-api/cosmwasm/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/code/verification-api/index.html b/code/verification-api/index.html index 92d8a468a..c79c6a4be 100644 --- a/code/verification-api/index.html +++ b/code/verification-api/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/contribution/202211-batch-import/index.html b/contribution/202211-batch-import/index.html index b7b5acc41..2c12486af 100644 --- a/contribution/202211-batch-import/index.html +++ b/contribution/202211-batch-import/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/contribution/near-welldone-migration/index.html b/contribution/near-welldone-migration/index.html index 4bc9c37f6..bdd5b4aaa 100644 --- a/contribution/near-welldone-migration/index.html +++ b/contribution/near-welldone-migration/index.html @@ -8,13 +8,13 @@ - +

    Wellcome to WELLDONE Wallet!


    NEAR Wallet Migration Helper


    This page is a guide for moving your NEAR account to a personal wallet from the web wallet.

    The way existing NEAR web wallet moves your account
    What is uncomfortable about it?
    Creating and adding a full access key using a new mnemonic for each account, but the new wallet cannot use the mnemonic because it imports accounts using private key.

    The way NEAR Migration Helper moves your account
    What is more comfortable about it?
    Because creating a full access key from the wallet where you want to move your accounts, you can manage your accounts using both your private key and mnemonic.

    1. Create an Access Key through a new mnemonic.
    2. Register the generated Access Key as a Full Access Key to the account you want to transfer.
    3. Remove old Full Access Keys.
    4. Import account to wallet using Private key of new Full Access Key

    1. Connect to NEAR web wallet with the account you want to migrate.
    2. Create an Implicit account from a new wallet that will be transferred.
    3. Please copy the ID or Public Key of the generated Implicit account.
    4. In the NEAR Migration Helper, type the copied Public Key* and press the Set button.
    5. If there is no error, press the Full access key button that appears.
    6. Open a new wallet and check if the account you want to move has been added**.

    WELLDONE Studio recommends you to delete the full access key that was previously used in the web wallet.
    *: You can also use the ID of the Implicit account for the input value.
    **: Depending on your wallet, you may need to proceed with your import account again.

    To use NEAR Migration Helper

    - + \ No newline at end of file diff --git a/execute-the-contract/index.html b/execute-the-contract/index.html index 4a36d32b9..742bd1ee4 100644 --- a/execute-the-contract/index.html +++ b/execute-the-contract/index.html @@ -8,13 +8,13 @@ - +

    Execute the Contract

    This article would like to provide a brief Counter example to demonstrate how to use a dapp:sendTransaction method to send transactions to smart contracts distributed by networks.

    The Counter example has increment and reset methods while the implementations are different for each network.

    The following is a straightforward example of the Solidity pseudocode.

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;

    contract Counter {
       int private count = 0;

       constructor(uint256 _count) {
      count = _count;
      }

       function increment(uint256 _count) public {
           count += _count;
      }

       function reset(uint256 _count) public {
           count = _count
      }
    }

    The following formats are frequently used for communication with smart contracts: TRANSACTION PARAMETER refers to the value of turning the transaction into a string type, and the parameters CHAIN NAME and TRANSACTION PARAMETER are transferred.

    The transaction is sent by WELLDONE Wallet by getting the pattern translated into a string type as shown below because each network has a unique transaction format.

    type CHAIN_NAME = 'ethereum' | 'cosmos' | 'near' | 'solana' | 'klaytn' | 'celo' | 'neon';
    type TRANSACTION_PARAMETER = 'string';

    const response = await dapp.request(CHAIN_NAME, {
    method: 'dapp:sendTransaction',
    params: [TRANSACTION_PARAMETER],
    });
    const txHash = response.hash;

    Each chain section below explains how each network can communicate with the contract.

    - + \ No newline at end of file diff --git a/getting-started/index.html b/getting-started/index.html index c5ae4613e..3c0d544e0 100644 --- a/getting-started/index.html +++ b/getting-started/index.html @@ -8,13 +8,13 @@ - +

    Getting Started

    Install the WELLDONE Wallet in the browser of your choice on your machine to begin developing using WELLDONE's services. It is available for download here.

    note

    You are required to have intermediate knowledge of HTML, CSS, JavaScript for exploring this documentation.

    After installing and launching the WELLDONE Wallet, you must confirm that there are window.dapp objects available in the new browser tab developer console. This is the way your website communicates with the WELLDONE Wallet. The guide below will guide you further.

    - + \ No newline at end of file diff --git a/index.html b/index.html index 7028dbc97..27bd9a06f 100644 --- a/index.html +++ b/index.html @@ -8,13 +8,13 @@ - +

    Tools for Web3 Voyagers.

    We build multi-purpose blockchain infrastructure with a user-friendly interface.

    WELLDONE Wallet

    Enabling new levels of performance with a single provider. A single wallet for all your assets. And develop, test, and deploy easily across multiple chains.

    WELLDONE Code

    Versatile code for enhanced productivity. Apply WELLDONE Code to Remix IDE (development tools) to seamlessly use various languages and compilers when building smart contracts.

    - + \ No newline at end of file diff --git a/intro/index.html b/intro/index.html index caee96f73..6af489f8e 100644 --- a/intro/index.html +++ b/intro/index.html @@ -8,13 +8,13 @@ - +

    Introduction

    Welcome to the WELLDONE Studio developer documentation. WELLDONE Studio creates the tools that web3 developers require the most. Integrating disparate web3 development experiences to assist builders in developing more naturally and simply. We are always thinking about ways to make Web3 more familiar for builders. We exist to help you realize your full potential and aim your efforts in the appropriate direction. These considerations have resulted in the following tools in WELLDONE Studio.

    WELLDONE Wallet allows you to create an account in a multi-chain environment with a single click. AddChain allows you to simply add a network, and WELLDONE Code allows you to easily deploy and execute contracts to multi-networks in a Remix IDE environment. We think that only an integrated multi-chain development environment can help Web3 builders to unleash their potential.

    Let's go through the fundamentals to get you started on your Web3 programming adventure.


    WELLDONE Wallet

    A single wallet for all your assets

    The wallet is geared for Web3 development that lets you manage assets across any network without any limits. If you are tired of managing assets distributed across networks with a plethora of wallets, we are glad that you are here. Start your Web3 experience combined into WELLDONE Wallet that supports a plethora of networks. Celestia, Celo, Cosmos, Ethereum, Juno, Klaytn, NEAR, Neon, Solana, Neutron, Aptos, and Sui are presently supported by WELLDONE Wallet. We are planning to support more networks in near future.

    Universal Provider

    Level up your performance with a single provider. For developers that want more.

    The Universal Provider is the most efficient library designed for Web3 developers, allowing you to enjoy the development experience by integrating Web 3.0 providers into a single API. It eliminates complicated development procedures and simply connects to considerable chains of networks, allowing you to focus on the services that you are building.

    How to use


    WELLDONE Code

    Multi-Chain Plugin

    WELLDONE Code is a useful Remix IDE plugin that allows you to deploy and test smart contracts from a plethora of networks in a single Remix IDE. You may have noticed that you need to reconstruct the development environment according to the target network to that you are going to deploy contracts. We provide a fundamental setting that supports multiple smart contract development environments in which developers may concentrate on the development itself.

    Three chains are now supported by WELLDONE Code: Celo, Klaytn, NEAR, Juno, Sui, and Aptos. We also plans to support other chains.

    How to use

    • Please refer to the following guide to deploy contracts using WELLDONE Code.
    • You are recommended to look at the documentation to get more profound ideas on WELLDONE Code.

    What's next for WELLDONE Studio

    WELLDONE Studio provides standardized tools to assist Web3 builders in creating value from a consistent experience centered on three basic values: Universal, Contributing, and Pioneering.

    We will enable more different networks in the future to continue to support developers to enjoy a more consistent experience in a multi-chain ecosystem. We also plan to allow existing SDKs to inject and utilize WELLDONE Wallet.

    Please follow the developer guides below if you are interested in building your web3 projects using WELLDONE Studio products.

    1. WELLDONE Wallet Developer Guide
    2. WELLDONE AddChain Developer Guide
    3. WELLDONE Code Guide

    Have fun!

    We are delighted to have you here and look forward to enjoying the journey on web3 world. Hello and welcome to the WELLDONE community!

    - + \ No newline at end of file diff --git a/ko/404.html b/ko/404.html index 9837e5049..7a40cdde0 100644 --- a/ko/404.html +++ b/ko/404.html @@ -8,13 +8,13 @@ - +

    404

    Page not found

    Sorry, we couldn’t find the page you’re looking for.
    Be sure to check your URL please or let us help you.
    - + \ No newline at end of file diff --git a/ko/aboutus/brand/index.html b/ko/aboutus/brand/index.html index 5577bd567..c2431b446 100644 --- a/ko/aboutus/brand/index.html +++ b/ko/aboutus/brand/index.html @@ -8,13 +8,13 @@ - +

    WELLDONE Brand Guidelines

    Brand assets of WELLDONE Studio and products under it.

    welldone

    Table of Contents

    Abstract

    • WELLDONE Studio와 그 하위 브랜드를 위한 비주얼 에셋 가이드 페이지입니다.
    • 웰던 스튜디오와 관련된 그래픽을 제작할 때 참고할 수 있습니다

    WELLDONE Studio

    Guide in brief

    • WELLDONE Studio는 그 하위의 Wallet, Code for REMIX Plugin, Addchain을 모두 포괄하는 하나의 상위 브랜드입니다.
    • 본 브랜드의 비주얼 에셋과 펫네임을 통해 모든 하위 프로덕트를 지칭할 수 있으나, 하위 레벨의 브랜드/ 프로덕트 아이덴티티는 WELLDONE Studio를 지칭할 수 없습니다.

    Typography

    Color

    Rectangle 233.png

    • Light Blue (for dark BG): #6AB8FF
    • Dark Blue (for light BG): #2D6CFF

    Symbol and Logo (SVG & PNG)

    Usage guidelines

    WELLDONE Studio를 지칭하는 심볼과 로고입니다.

    studio brand kit

    1. WELLDONE Studio의 공식 브랜드 심볼은 본 리스트에 있는 디자인에 한정되며, 아웃라인/ 색상/ 텍스트 등이 수정될 수 없습니다.
    2. 배경과의 상호작용을 고려해 밝은 버전/ 어두운 버전을 선택적으로 적용해야 합니다.
    3. 뒷배경의 산만한 그래픽이나 주변 여백과의 관계로 인해, 본 디자인이 흐릿하게 보이지 않아야 합니다.
    4. 배경으로 고채도 혹은 복잡한 패턴이 사용될 수 없으며, 명도와 채도 대비가 선명한 환경이 적용돼야 합니다.

    WELLDONE Wallet

    Color

    Rectangle 234.png

    • Point color: #00D6D6
    • Light Blue (for dark BG): #6AB8FF
    • Dark Blue (for light BG): #2D6CFF

    Symbol and Logo (SVG & PNG)

    Usage guidelines

    WELLDONE Wallet을 지칭하는 심볼과 로고입니다.

    wallet brand kit

    1. WELLDONE Wallet의 공식 브랜드 심볼은 본 리스트에 있는 디자인에 한정되며, 아웃라인/ 색상/ 텍스트 등이 수정될 수 없습니다.
    2. WELLDONE Wallet을 의미하는 Product logo는 WELLDONE Studio 심볼과 분리돼 독립적으로 사용될 수 없습니다.
    3. 배경과의 상호작용을 고려해 밝은 버전/ 어두운 버전을 선택적으로 적용해야 합니다.
    4. 뒷배경의 산만한 그래픽이나 주변 여백과의 관계로 인해, 본 디자인이 흐릿하게 보이지 않아야 합니다.
    5. 배경으로 고채도 혹은 복잡한 패턴이 사용될 수 없으며, 명도와 채도 대비가 선명한 환경이 적용돼야 합니다.
    - + \ No newline at end of file diff --git a/ko/aboutus/contributions/index.html b/ko/aboutus/contributions/index.html index 8806d1cb8..80c38f8a2 100644 --- a/ko/aboutus/contributions/index.html +++ b/ko/aboutus/contributions/index.html @@ -8,13 +8,13 @@ - +

    WELLDONE Studio's Contributions

    Below is a list of contents that WELLDONE Studio contributed to outside.

    Tags

    NEAR
    APTOS
    SUI
    JUNO
    COSMOS
    WELLDONE Code
    WELLDONE Wallet
    RemixIDE
    CosmWasm
    Verification
    Article
    Video
    Open Source
    Education

    Contributions

    WELLDONE Code(1) — Remix IDE plugin for MultichainIntroducing WELLDONE Code (Remix IDE Plugin) to NEAR Protocol Medium.
    NEAR
    WELLDONE Code
    RemixIDE
    Article
    WELLDONE Code(2) — Don’t trust, verify.Introducing WELLDONE Code (Verification) to NEAR Protocol Medium.
    NEAR
    WELLDONE Code
    Article
    AwesomeNEAR - WELLDONE WalletWallet for Web3 Voyagers
    NEAR
    WELLDONE Wallet
    NEAR Wallet SelectorThis is a wallet selector modal that allows users to interact with NEAR dApps with a selection of available wallets.
    NEAR
    WELLDONE Wallet
    Open Source
    APTOS SLIP-0044 SignerCreate Account with hdpath 637
    APTOS
    WELLDONE Wallet
    Open Source
    APTOS Wallet AdapterA monorepo modular wallet adapter for Aptos applications
    APTOS
    WELLDONE Wallet
    Open Source
    NEAR Official DocsIntroduction to how to use WELLDONE Code on NEAR
    NEAR
    WELLDONE Code
    RemixIDE
    Article
    APTOS Official DocsIntroduction to how to use WELLDONE Code on Aptos
    APTOS
    WELLDONE Code
    RemixIDE
    Article
    Add Ed25519Keypair.fromDerivePath methodmake keypair from sui derive path (m/44'/784'/0'/0'/0')
    SUI
    WELLDONE Wallet
    SUI Directory - WELLDONE WalletWELLDONE Wallet is an integrated, non-custodial wallet that allows you to freely manage your assets across any network.
    SUI
    WELLDONE Wallet
    SUI Directory - WELLDONE CodeWELLDONE Code is a web-based tool with Move module deployment features and capabilities for developers to interact with deployed modules.
    SUI
    WELLDONE Code
    SUI Developer Portal - WELLDONE CodeThis plug-in for the Remix web-based IDE features a graphical interface for developing Move modules.
    SUI
    WELLDONE Code
    SUI Wallet StandardWELLDONE Wallet implemented Wallet Standard
    SUI
    WELLDONE Wallet
    Open Source
    Deploy & Write NEAR Smart Contracts on REMIX IDETutorial video about how to deploy & write NEAR Smart Contracts on REMIX IDE
    NEAR
    WELLDONE Code
    RemixIDE
    Video
    JUNO Ecosystem - WELLDONE CodeWELLDONE Code is a Remix IDE plugin to deploy and execute CosmWasm smart contracts
    JUNO
    WELLDONE Code
    Awesome-CosmWasm: WELLDONE CodeRemix IDE plugin that supports CosmWasm.
    COSMOS
    WELLDONE Code
    CosmWasm
    DSRV Labs | Remix IDE Plugin for Sui | Sui Builder House Hong KongIntroduction video about WELLDONE Code, the Remix IDE Plugin for SUI
    SUI
    WELLDONE Code
    RemixIDE
    Video
    Instant Coding with Remix IDE and WELLDONE CodeThe browser-based Remix IDE, combined with the WELLDONE Code plug-in, lets you build Sui apps with no local setup or installations.
    SUI
    WELLDONE Code
    RemixIDE
    AIP-X Code Verification APIThis API proposal seeks to introduce a standard protocol for the verification of Aptos Move smart contract code.
    APTOS
    WELLDONE Code
    Verification
    SIP-3: Code Verification APIA standard protocol for the verification of SUI Move smart contract code.
    SUI
    WELLDONE Code
    Verification
    SIP-4: Dependency Update Check API standard protocol for the API that checks the latest version of a dependency.
    SUI
    WELLDONE Code
    Verification
    Universal Serializer: Decentralize Your Multichain Game on #BOS w/ DSRV labsHyunsun Yoo from the DSRV labs and Welldone wallet team show a product demo on decentralizing your game with BOS.
    NEAR
    WELLDONE Code
    RemixIDE
    Video
    웰던 스튜디오의 Sui 파헤치기Sui(수이)는 유저와 개발자 모두에게 친화적인 레이어1 네트워크입니다. 빠른 속도와 적은 거래비용을 통해서 광범위한 사용성을 지향하고 있습니다. 웰던스튜디오는 Sui의 공식적인 교육 파트너로서 해당 네트워크를 통한 개발과 사용의 구체적인 과정을 안내해 드리고자 합니다.
    NEAR
    WELLDONE Code
    RemixIDE
    Video
    WELLDONE Wallet
    Education
    SUI
    NEP-413: NEAR Wallet SelectorUpdate NEP-413 support method on wallet selector core package
    NEAR
    WELLDONE Wallet
    Open Source
    - + \ No newline at end of file diff --git a/ko/aboutus/index.html b/ko/aboutus/index.html index 4f208538f..15fe53709 100644 --- a/ko/aboutus/index.html +++ b/ko/aboutus/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ 2. Explore our listing in the official Neutron docs: https://docs.neutron.org/tutorials/cosmwasm_remix Learn more at: https://docs.welldonestudio.io/code/getting-started
  • 🚀 What is @WelldoneStudio_
    🚀 What is @WelldoneStudio_
    supporting the developer ecosystem at @dsrvlabs, doing in the @SuiNetwork ecosystem? Let's dive in! (1/5)
  • 🎊 Exciting news! @WelldoneStudio_
    🎊 Exciting news! @WelldoneStudio_
    has been awarded a grant from @SuiNetwork following a rigorous milestone review.
  • #WELLDONEAcademy 2nd
    #WELLDONEAcademy 2nd
    다음 달 #SuiBuilderHouse in Seoul을 앞두고, #WELLDONEAcademy 가 진행됐습니다🧑‍💻 이번 웰던 아카데미는 Sui에 대한 소개와 이론, 실제 온보딩까지의 지식을 한국의 #Sui 빌더들과 함께 나누었고, @SuiNetwork의 @theharrisonkim님도 함께 해주셔 더욱 뜻깊은 시간을 만들어 나갔습니다 🥳 @dsrvlabs
  • 🔭 Voyagers, ready for #SuiBuilderHouse Hackathon in Seoul?
    🔭 Voyagers, ready for #SuiBuilderHouse Hackathon in Seoul?
    Dive into browser-based #WELLDONEWallet & #WELLDONECode to build @SuiNetwork's apps.
  • Ready to launch your Coin on Aptos?
    Ready to launch your Coin on Aptos?
    Use #WELLDONEWallet and #WELLDONECode and deploy directly through #RemixIDE.
  • Hoi! 🇳🇱 the Hack Holland #AptosWorldTour.
    Hoi! 🇳🇱 the Hack Holland #AptosWorldTour.
    we're equipping your Move-ment to be 'Apt to Succeed' on your #Aptos voyage. Let's foster the bloom of #Web3 🌷!
  • NEAR Blockchain Foundation Week
    NEAR Blockchain Foundation Week
    @suji_forcrypto's presentation at @Xangle_official Blockchain Foundation Week.
  • Xin chào, Voyagers!
    Xin chào, Voyagers!
    Kicking off with our WELLDONE Wallet presentation, look forward to new dev tools next month! Stay tuned!
  • 🇭🇰 We Showcased our contributions to @SuiNetwork
    🇭🇰 We Showcased our contributions to @SuiNetwork
    🎉 Fantastic session at the #SuiBuilderHouse event in Hong Kong today!
  • Annyeonghaseyo! 🇰🇷
    Annyeonghaseyo! 🇰🇷
    we were thrilled to conduct a workshop on #WELLDONEWallet & #WELLDONECode for #Sui users! We hope you found it useful for optimizing your onboarding process.
  • The future is #NEAR, and #BOS is the Future!
    The future is #NEAR, and #BOS is the Future!
    Great chat with @ilblackdragon, CEO of @NEARProtocol!
  • Sui Move Developer Coworking Meetup
    Sui Move Developer Coworking Meetup
    🧑‍💻 Exciting 'Sui Move Developer Coworking Meetup' (모각코) in Seoul today!
  • At our workshop hosted by @AwesomWasm,
    At our workshop hosted by @AwesomWasm,
    We demonstrated how #WELLDONEWallet & #WELLDONECode can help onboard newcomers or developers from other chains to Neutron_org with ease.
  • Thanks to @CosmWasm and @misangmadrid for the fantastic invitation to the incredible #HackWasm event!
    Thanks to @CosmWasm and @misangmadrid for the fantastic invitation to the incredible #HackWasm event!
    In our session, we delved into the core of code verification and had insightful discussions for the robustness of the Cosmwasm ecosystem. It was an awesome and WELLDONE time😆! @cosmos @AwesomWasm @Neutron_org @dsrvlabs
  • 🎉 What a fantastic session at @ethconkr!
    🎉 What a fantastic session at @ethconkr!
    WELLDONE Studio talked about our brilliant collaboration with @EthereumRemix, our unified philosophy on multi-chains, and the future of sustainable blockchain dev infrastructure.
  • 🙌 Big S/O to Rob from @EthereumRemix and @maczniak from @AllThatNode for the Remix ZKP Challenge!
    🙌 Big S/O to Rob from @EthereumRemix and @maczniak from @AllThatNode for the Remix ZKP Challenge!
    We used Remix to submit proofs instead of direct answers, ensuring privacy while proving solutions. Correct proofs could earn a Remixer NFT. Stay tuned for our next session! #DSRVBuildersHouse
  • Fantastic live session by @sunny_yooo 🚀!
    Fantastic live session by @sunny_yooo 🚀!
    She leveraged @NEARProtocol BOS to decentralize gaming ecosystem an innovative approach to web3 development. We're looking forward to a multi-chain ecosystem on #BOS. Try our @SuiNetwork game on BOS!
  • and...One more thing 👀
    and...One more thing 👀
    To make our idea work seamlessly, we've developed and been using WELLDONE Wallet for multi-chain.
  • 💧@SuiNetwork에 대한 한국어 강의가 필요하신가요?
    💧@SuiNetwork에 대한 한국어 강의가 필요하신가요?
    WELLDONE Studio가 한국 최고의 교육 플랫폼 @inflearn에서 Sui 강의를 무료로 배포합니다. 학습 중 궁금한 것이 생기면 편하게 알려주세요. 찾아오시면 더 좋습니다!
  • Yeah, here we go! 🚀
    Yeah, here we go! 🚀
    🇰🇷 WELLDONE Studio has designed a course tailored for Korean-speaking developers interested in building on the @SuiNetwork.
  • Ready to unlock Arbitrum's potential with Rust on REMIX, $ARB holders?
    Ready to unlock Arbitrum's potential with Rust on REMIX, $ARB holders?
    WELLDONE Code is live at @gitcoin's Grant Funding Fest (Dev Tooling). We integrated @EthereumRemix & @rustlang for EVM+ smart contracts!
  • 🎊 WELLDONE Studio is celebrating the one-year anniversary of @aptos_network mainnet launch!
    🎊 WELLDONE Studio is celebrating the one-year anniversary of @aptos_network mainnet launch!
    Our collaboration has created a stronger flow for the L1 blockchain with Move language, and the grant proves it. Let's keep pushing forward together 😉.
  • 💙 Sharing a fantastic partnership session with the @EthereumRemix team!
    💙 Sharing a fantastic partnership session with the @EthereumRemix team!
    Our collaboration is just beginning, with the aim of further enriching the multi-chain ecosystem!
  • @dsrv/kms by WELLDONE Studio is making a new history as a multi-chain key management package!
    @dsrv/kms by WELLDONE Studio is making a new history as a multi-chain key management package!
    Explore keys, signatures, and wallets with our experts from @dsrvlabs
  • 😉WELL-DONE, @movebuilders!
    😉WELL-DONE, @movebuilders!
    We'll always grind to make onboarding for #movelang easier with @EthereumRemix 🚀 #PublicGoodsAreGood
  • <Secure Coding: Essential for Safe Applications >
    <Secure Coding: Essential for Safe Applications >
    🛡 In a dynamic multi-chain dev ecosystem, secure coding is crucial. Last week, WELLDONE Studio held a workshop envisioning an ideal Web3 environment, emphasizing secure practices. Let's always prioritize our code safety!
  • <WELLDONE Studio's 2023 Milestones>
    <WELLDONE Studio's 2023 Milestones>
    Wrapping up 2023, we reflect on a remarkable year at WELLDONE Studio! 🚀
  • We have just unveiled an article on the Aptos Account Model
    We have just unveiled an article on the Aptos Account Model
    Resource Accounts, Standard Accounts, Object Model. Available in both English and Korean.

  • For Web3 Voyagers.

    Elevating the Web3 space, our brand paves the way for a streamlined journey across the digital frontier. We champion standardization, offering state-of-the-art tools that translate into a seamless, consistent experience for Web3 explorers.

    With us, the value of Web3 unfolds through a harmonized expedition, universally accessible. We leave our footprint at every Web3 gateway, demonstrating our contribution and pioneering expertise in the ever-evolving Web3 standards. Explore with us. Pioneer with us. Let's shape the future of Web3 together.

    WELLDONE


    Our Members

    - + \ No newline at end of file diff --git a/ko/assets/js/259bd3b2.b8fcf6c3.js b/ko/assets/js/259bd3b2.b8fcf6c3.js new file mode 100644 index 000000000..9e8791198 --- /dev/null +++ b/ko/assets/js/259bd3b2.b8fcf6c3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[153],{3905:function(e,t,n){n.d(t,{Zo:function(){return A},kt:function(){return u}});var a=n(67294);function l(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(l[n]=e[n]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=a.createContext({}),c=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},A=function(e){var t=c(e.components);return a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var n=e.components,l=e.mdxType,o=e.originalType,p=e.parentName,A=r(e,["components","mdxType","originalType","parentName"]),g=c(n),u=l,s=g["".concat(p,".").concat(u)]||g[u]||d[u]||o;return n?a.createElement(s,i(i({ref:t},A),{},{components:n})):a.createElement(s,i({ref:t},A))}));function u(e,t){var n=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=n.length,i=new Array(o);i[0]=g;var r={};for(var p in t)hasOwnProperty.call(t,p)&&(r[p]=t[p]);r.originalType=e,r.mdxType="string"==typeof e?e:l,i[1]=r;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=o.createContext({}),p=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},A=function(e){var t=p(e.components);return o.createElement(c.Provider,{value:t},e.children)},g={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,c=e.parentName,A=r(e,["components","mdxType","originalType","parentName"]),d=p(n),u=i,s=d["".concat(c,".").concat(u)]||d[u]||g[u]||a;return n?o.createElement(s,l(l({ref:t},A),{},{components:n})):o.createElement(s,l({ref:t},A))}));function u(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,l=new Array(a);l[0]=d;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,l[1]=r;for(var p=2;p=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var p=o.createContext({}),l=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(n),m=r,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l\n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.rs\n \u2514\u2500\u2500 examples\n \u2514\u2500\u2500 schema.rs \n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server. The build environment is crucial for contract verification due to the non-deterministic nature of building Rust into Wasm.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm and schema files are returned."),(0,a.kt)("img",{src:n(83479).Z,alt:"neutron-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned wasm file and schema files in ",(0,a.kt)("inlineCode",{parentName:"p"},"neutron//artifacts")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"neutron//schema"),"."),(0,a.kt)("p",{parentName:"admonition"},"When you run the recompilation, the existing ",(0,a.kt)("inlineCode",{parentName:"p"},"artifacts")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"schema")," folders will be deleted and the compilation process will start anew.")),(0,a.kt)("h2",{id:"store-code"},"Store Code"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Store Code")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Gas price is set to 0.025 untrn/untrnx as a default and can be modified. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Store Code")," button."),(0,a.kt)("img",{src:n(21802).Z,alt:"neutron-store-code",style:{width:"70%"}}),(0,a.kt)("h2",{id:"instantiate-the-contract"},"Instantiate the Contract"),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,a.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can choose whether to allow contract upgrades or make them unmodifiable through the immutable option."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": If there are arguments for contract instantiation, input the parameters and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Instantiate")," button. The arguments are generated through ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/rjsf-team/react-jsonschema-form"},"react-jsonschema-form"),"."),(0,a.kt)("img",{src:n(4338).Z,alt:"neutron-instantiate",style:{width:"318px"}}),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,a.kt)("inlineCode",{parentName:"p"},"Query")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"Execute")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,a.kt)("img",{src:n(39310).Z,alt:"neutron-execute",style:{width:"100%"}}),(0,a.kt)("h2",{id:"migrate-the-contract"},"Migrate the Contract"),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,a.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Select the method as ",(0,a.kt)("inlineCode",{parentName:"p"},"migrate"),"."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": Enter the target contract address for the migration and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Migrate")," button."),(0,a.kt)("img",{src:n(65583).Z,alt:"neutron-migrate",style:{width:"318px"}}))}m.isMDXComponent=!0},83479:function(e,t,n){t.Z=n.p+"assets/images/compile-neutron-3cb09fb4a3361dda74f242d17a6d2999.png"},39310:function(e,t,n){t.Z=n.p+"assets/images/neutron-execute-bd82e6757e180aa24cbd85b5580e4164.png"},4338:function(e,t,n){t.Z=n.p+"assets/images/neutron-instantiate-4d17efe1d0cd02019a1ad7a966c8a47d.png"},65583:function(e,t,n){t.Z=n.p+"assets/images/neutron-migrate-d828179875e2d8ae62f554dbcdfebea9.png"},21802:function(e,t,n){t.Z=n.p+"assets/images/neutron-store-code-3f097f8777216205609b16ddcc0340f4.png"},69650:function(e,t,n){t.Z=n.p+"assets/images/template-code-neutron-7a08437d450cd74c638086b594036f0c.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/2b9123c9.b5aaa32f.js b/ko/assets/js/2b9123c9.b5aaa32f.js deleted file mode 100644 index 0a0637ca0..000000000 --- a/ko/assets/js/2b9123c9.b5aaa32f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[7362],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var r=n(67294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),l=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(n),m=o,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||a;return n?r.createElement(h,i(i({ref:t},u),{},{components:n})):r.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:o,i[1]=c;for(var l=2;l\n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.rs\n \u2514\u2500\u2500 examples\n \u2514\u2500\u2500 schema.rs \n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server. The build environment is crucial for contract verification due to the non-deterministic nature of building Rust into Wasm.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm and schema files are returned."),(0,a.kt)("img",{src:n(83479).Z,alt:"neutron-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned wasm file and schema files in ",(0,a.kt)("inlineCode",{parentName:"p"},"neutron//artifacts")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"neutron//schema"),"."),(0,a.kt)("p",{parentName:"admonition"},"When you run the recompilation, the existing ",(0,a.kt)("inlineCode",{parentName:"p"},"artifacts")," and ",(0,a.kt)("inlineCode",{parentName:"p"},"schema")," folders will be deleted and the compilation process will start anew.")),(0,a.kt)("h2",{id:"store-code"},"Store Code"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Store Code")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Gas price is set to 0.025 untrn/untrnx as a default and can be modified. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Store Code")," button."),(0,a.kt)("img",{src:n(21802).Z,alt:"neutron-store-code",style:{width:"70%"}}),(0,a.kt)("h2",{id:"instantiate-the-contract"},"Instantiate the Contract"),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,a.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can choose whether to allow contract upgrades or make them unmodifiable through the immutable option."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": If there are arguments for contract instantiation, input the parameters and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Instantiate")," button. The arguments are generated through ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/rjsf-team/react-jsonschema-form"},"react-jsonschema-form"),"."),(0,a.kt)("img",{src:n(4338).Z,alt:"neutron-instantiate",style:{width:"318px"}}),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,a.kt)("inlineCode",{parentName:"p"},"Query")," or ",(0,a.kt)("inlineCode",{parentName:"p"},"Execute")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,a.kt)("img",{src:n(39310).Z,alt:"neutron-execute",style:{width:"100%"}}),(0,a.kt)("h2",{id:"migrate-the-contract"},"Migrate the Contract"),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,a.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Select the method as ",(0,a.kt)("inlineCode",{parentName:"p"},"migrate"),"."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": Enter the target contract address for the migration and click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Migrate")," button."),(0,a.kt)("img",{src:n(65583).Z,alt:"neutron-migrate",style:{width:"318px"}}))}m.isMDXComponent=!0},83479:function(e,t,n){t.Z=n.p+"assets/images/compile-neutron-3cb09fb4a3361dda74f242d17a6d2999.png"},39310:function(e,t,n){t.Z=n.p+"assets/images/neutron-execute-bd82e6757e180aa24cbd85b5580e4164.png"},4338:function(e,t,n){t.Z=n.p+"assets/images/neutron-instantiate-4d17efe1d0cd02019a1ad7a966c8a47d.png"},65583:function(e,t,n){t.Z=n.p+"assets/images/neutron-migrate-d828179875e2d8ae62f554dbcdfebea9.png"},21802:function(e,t,n){t.Z=n.p+"assets/images/neutron-store-code-3f097f8777216205609b16ddcc0340f4.png"},69650:function(e,t,n){t.Z=n.p+"assets/images/template-code-neutron-7a08437d450cd74c638086b594036f0c.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/363b7c43.068f5fff.js b/ko/assets/js/363b7c43.068f5fff.js new file mode 100644 index 000000000..fd88555bd --- /dev/null +++ b/ko/assets/js/363b7c43.068f5fff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[5983],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=p(n),m=r,h=d["".concat(l,".").concat(m)]||d[m]||s[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p\n \u251c\u2500\u2500 Move.toml\n \u251c\u2500\u2500 Move.lock\n \u2514\u2500\u2500 sources\n \u2514\u2500\u2500 YOUR_CONTRACT_FILE.move\n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a compiled binary file is returned."),(0,a.kt)("img",{src:n(29671).Z,alt:"sui-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned compiled binary file in ",(0,a.kt)("inlineCode",{parentName:"p"},"sui//out")," directory.")),(0,a.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," to sign the transaction."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:n(78844).Z,title:"Deploy",width:"2418",height:"1664"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),"\n: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:n(2857).Z,title:"Deploy",width:"2408",height:"1618"})),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"There are two ways to import contracts."),(0,a.kt)("ol",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ol"},"Automatically import contracts deployed through the above process."),(0,a.kt)("li",{parentName:"ol"},"Import existing deployed contracts through ",(0,a.kt)("inlineCode",{parentName:"li"},"At Address")," button."))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": You can check the Packages, and Modules owned by the current account, and you can read the Objects through the ",(0,a.kt)("inlineCode",{parentName:"p"},"Query Object")," button."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," is required because the transaction signature and request are required."),(0,a.kt)("img",{src:n(22920).Z,alt:"entry-sui",style:{width:"500px"}}))}m.isMDXComponent=!0},22920:function(e,t,n){t.Z=n.p+"assets/images/entry-sui-436aba0195b3372d932635c0fb52a324.png"},92765:function(e,t,n){t.Z=n.p+"assets/images/new-project-sui-d601ee9d8bfcaf072ca1f96eb7d793a1.png"},29671:function(e,t,n){t.Z=n.p+"assets/images/sui-compile-c17f51ca90231770cf8293fa3363c37f.png"},29720:function(e,t,n){t.Z=n.p+"assets/images/template-code-sui-fe2887b64d67bb396e9cec6752cc40c9.png"},78844:function(e,t,n){t.Z=n.p+"assets/images/deploy-sui-1d4182f860ef8f7ece06be39ad285d7b.png"},2857:function(e,t,n){t.Z=n.p+"assets/images/deployed-contract-sui-a169574d6f57a0ad35a473a619c163ae.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/363b7c43.3bc84df1.js b/ko/assets/js/363b7c43.3bc84df1.js deleted file mode 100644 index f4b02be71..000000000 --- a/ko/assets/js/363b7c43.3bc84df1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[5983],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var o=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),p=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return o.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=p(n),m=r,h=d["".concat(l,".").concat(m)]||d[m]||s[m]||a;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=d;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p\n \u251c\u2500\u2500 Move.toml\n \u251c\u2500\u2500 Move.lock\n \u2514\u2500\u2500 sources\n \u2514\u2500\u2500 YOUR_CONTRACT_FILE.move\n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,a.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," button. "),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a compiled binary file is returned."),(0,a.kt)("img",{src:n(29671).Z,alt:"sui-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"You can check the returned compiled binary file in ",(0,a.kt)("inlineCode",{parentName:"p"},"sui//out")," directory.")),(0,a.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," button will be activated."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": Click the ",(0,a.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," to sign the transaction."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:n(78844).Z,title:"Deploy",width:"2418",height:"1664"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),"\n: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:n(2857).Z,title:"Deploy",width:"2408",height:"1618"})),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"There are two ways to import contracts."),(0,a.kt)("ol",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ol"},"Automatically import contracts deployed through the above process."),(0,a.kt)("li",{parentName:"ol"},"Import existing deployed contracts through ",(0,a.kt)("inlineCode",{parentName:"li"},"At Address")," button."))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": You can check the Packages, and Modules owned by the current account, and you can read the Objects through the ",(0,a.kt)("inlineCode",{parentName:"p"},"Query Object")," button."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the ",(0,a.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," is required because the transaction signature and request are required."),(0,a.kt)("img",{src:n(22920).Z,alt:"entry-sui",style:{width:"500px"}}))}m.isMDXComponent=!0},22920:function(e,t,n){t.Z=n.p+"assets/images/entry-sui-436aba0195b3372d932635c0fb52a324.png"},92765:function(e,t,n){t.Z=n.p+"assets/images/new-project-sui-d601ee9d8bfcaf072ca1f96eb7d793a1.png"},29671:function(e,t,n){t.Z=n.p+"assets/images/sui-compile-c17f51ca90231770cf8293fa3363c37f.png"},29720:function(e,t,n){t.Z=n.p+"assets/images/template-code-sui-fe2887b64d67bb396e9cec6752cc40c9.png"},78844:function(e,t,n){t.Z=n.p+"assets/images/deploy-sui-1d4182f860ef8f7ece06be39ad285d7b.png"},2857:function(e,t,n){t.Z=n.p+"assets/images/deployed-contract-sui-a169574d6f57a0ad35a473a619c163ae.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/399fe57e.ba334781.js b/ko/assets/js/399fe57e.ba334781.js new file mode 100644 index 000000000..3874f6756 --- /dev/null +++ b/ko/assets/js/399fe57e.ba334781.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[1584],{3905:function(e,t,A){A.d(t,{Zo:function(){return C},kt:function(){return d}});var n=A(67294);function o(e,t,A){return t in e?Object.defineProperty(e,t,{value:A,enumerable:!0,configurable:!0,writable:!0}):e[t]=A,e}function a(e,t){var A=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),A.push.apply(A,n)}return A}function l(e){for(var t=1;t=0||(o[A]=e[A]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,A)&&(o[A]=e[A])}return o}var r=n.createContext({}),i=function(e){var t=n.useContext(r),A=t;return e&&(A="function"==typeof e?e(t):l(l({},t),e)),A},C=function(e){var t=i(e.components);return n.createElement(r.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var A=e.components,o=e.mdxType,a=e.originalType,r=e.parentName,C=p(e,["components","mdxType","originalType","parentName"]),c=i(A),d=o,s=c["".concat(r,".").concat(d)]||c[d]||m[d]||a;return A?n.createElement(s,l(l({ref:t},C),{},{components:A})):n.createElement(s,l({ref:t},C))}));function d(e,t){var A=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=A.length,l=new Array(a);l[0]=c;var p={};for(var r in t)hasOwnProperty.call(t,r)&&(p[r]=t[r]);p.originalType=e,p.mdxType="string"==typeof e?e:o,l[1]=p;for(var i=2;i\n \u251c\u2500\u2500 Move.toml\n \u2514\u2500\u2500 sources\n \u2514\u2500\u2500 YOUR_CONTRACT_FILE.move\n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": ",(0,a.kt)("strong",{parentName:"p"},"PROJECT TO COMPILE")," \uc139\uc158\uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ud504\ub85c\uc81d\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": \ucef4\ud30c\uc77c \uc635\uc158\uc744 \uc120\ud0dd\ud55c \ud6c4 ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": \ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub418\uba74 \ucef4\ud30c\uc77c\ub41c \ubc14\uc774\ub108\ub9ac \ud30c\uc77c\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"PROJECT TO COMPILE")," \uc139\uc158\uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ud504\ub85c\uc81d\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\ucef4\ud30c\uc77c \ubc29\uc2dd\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Complie")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub418\uba74, wasm file\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.")),(0,a.kt)("img",{src:A(3795).Z,alt:"aptos-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ubc18\ud658\ub41c wasm \ud30c\uc77c\uc740 ",(0,a.kt)("inlineCode",{parentName:"p"},"aptos//out")," \ub514\ub809\ud1a0\ub9ac \uc548\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4."),(0,a.kt)("p",{parentName:"admonition"},"\ub2e8, \uc218\uc815 \ud6c4 \ucef4\ud30c\uc77c\uc744 \ub2e4\uc2dc \ud574\uc57c \ud55c\ub2e4\uba74 \ud504\ub85c\uc81d\ud2b8 \ub0b4\uc758 ",(0,a.kt)("inlineCode",{parentName:"p"},"out")," \ub514\ub809\ud1a0\ub9ac\ub97c \uc0ad\uc81c\ud558\uace0 \ub2e4\uc2dc \ucef4\ud30c\uc77c\ud574\uc57c \ud569\ub2c8\ub2e4.")),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"\ud604\uc7ac \uacc4\uc815\uc5d0 \ucda9\ubd84\ud55c APT(\uc57d 0.3APT) \uc774\uc0c1\uc774 \uc5c6\uc73c\uba74, \ud2b8\ub79c\uc7ad\uc158\uc5d0 \uc11c\uba85\uc774 \ubd88\uac00\ub2a5\ud55c \ubc84\uadf8\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc6d0\uc778\uc744 \ubd84\uc11d \uc911\uc774\uba70, \uace7 \ud574\uacb0\ud558\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. \uac1c\ubc1c\ud558\ub294\ub370 \ucc38\uace0\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.")),(0,a.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"WELLDONE Wallet\uc5d0\uc11c\ub294 \ud574\ub2f9 \uc9c0\uac11 \uc8fc\uc18c\uc5d0 \uc5f0\uacb0\ub41c \ub124\ud2b8\uc6cc\ud06c\ub97c \uc790\ub3d9\uc73c\ub85c \uac10\uc9c0\ud558\uc5ec \uac00\uc838\uc635\ub2c8\ub2e4. \ub530\ub77c\uc11c Deploy\ub97c \ud558\uae30 \uc774\uc804\uc5d0 \uba54\uc778\ub137\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\ub0bc \uac83\uc778\uc9c0, \ud14c\uc2a4\ud2b8\ub137\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\ub0bc \uac83\uc778\uc9c0 \ubbf8\ub9ac \uace0\ub824\ud574\ub450\uc5b4\uc57c \ud569\ub2c8\ub2e4.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": \ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub41c \ucee8\ud2b8\ub799\ud2b8 \ucf54\ub4dc\uac00 \uc788\ub294 \uacbd\uc6b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," \ubc84\ud2bc\uc774 \ud65c\uc131\ud654\ub429\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," \ubc84\ud2bc \ud074\ub9ad \ud6c4 WELLDONE Wallet \ucc3d\uc5d0\uc11c\xa0",(0,a.kt)("inlineCode",{parentName:"p"},"Send"),"\ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158\uc5d0 \uc11c\uba85\ud569\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:A(95073).Z,title:"Deploy",width:"1802",height:"1758"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": \ucee8\ud2b8\ub799\ud2b8 \ubc30\ud3ec\uac00 \uc131\uacf5\ud558\uba74 \ud130\ubbf8\ub110\uc5d0 \ud2b8\ub79c\uc7ad\uc158 \uc131\uacf5 \ub85c\uadf8\uac00 \ucd9c\ub825\ub418\uace0, \ucee8\ud2b8\ub799\ud2b8\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:A(82333).Z,title:"Deploy",width:"1768",height:"2002"})),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"\ucee8\ud2b8\ub799\ud2b8\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95\uc5d0\ub294 \ub450 \uac00\uc9c0\uac00 \uc788\uc2b5\ub2c8\ub2e4."),(0,a.kt)("ol",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ol"},"\uc704\uc758 \uacfc\uc815\uc744 \ud1b5\ud574 \ubc30\ud3ec\ud55c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc790\ub3d9\uc73c\ub85c \uac00\uc838\uc624\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"At address")," \ubc84\ud2bc\uc744 \ud1b5\ud574 \uae30\uc874\uc5d0 \ubc30\ud3ec\ub41c \ucee8\ud2b8\ub799\ud2b8\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95"))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": \ud604\uc7ac \uacc4\uc815\uc774 \uc18c\uc720\ud558\uace0 \uc788\ub294 \ubaa8\ub4c8\uacfc \ub9ac\uc18c\uc2a4\ub4e4\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\uba70, ",(0,a.kt)("inlineCode",{parentName:"p"},"Get Resource")," \ubc84\ud2bc\uc744 \ud1b5\ud574 \ud574\ub2f9 \ub9ac\uc18c\uc2a4\ub97c \uc77d\uc5b4 \uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,a.kt)("img",{src:A(88916).Z,alt:"view-aptos",style:{width:"318px"}}),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": \uc6d0\ud558\ub294 \ud568\uc218\ub97c \uc120\ud0dd\ud558\uace0, \ud544\uc694\uc5d0 \ub530\ub77c \ud30c\ub77c\ubbf8\ud130\ub97c \uc785\ub825\ud558\uba74 \ud574\ub2f9 \ud568\uc218\uc758 \uae30\ub2a5\uc774 \uc2e4\ud589 \ub429\ub2c8\ub2e4. ",(0,a.kt)("inlineCode",{parentName:"p"},"view")," \ud568\uc218\uac00 \uc544\ub2cc ",(0,a.kt)("inlineCode",{parentName:"p"},"entry")," \ud568\uc218\uc758 \uacbd\uc6b0\uc5d0\ub294 \ud2b8\ub79c\uc7ad\uc158 \uc11c\uba85\uacfc \uc694\uccad\uc774 \ud544\uc694\ud558\uae30 \ub54c\ubb38\uc5d0 WELLDONE Wallet\uc5d0\uc11c\uc758 \uc11c\uba85\uc774 \ud544\uc694\ud569\ub2c8\ub2e4."),(0,a.kt)("img",{src:A(61133).Z,alt:"entry-aptos",style:{width:"500px"}}))}d.isMDXComponent=!0},3795:function(e,t){t.Z="data:image/png;base64,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"},61133:function(e,t,A){t.Z=A.p+"assets/images/entry-aptos-3fb256ecc3e8d6ef9ef37f5a37f5fa00.png"},88916:function(e,t,A){t.Z=A.p+"assets/images/view-aptos-3c614c0885eaf3156e182181894e54eb.png"},95073:function(e,t,A){t.Z=A.p+"assets/images/deploy-aptos-8294285811a4f4ae840a8904925c99f7.png"},82333:function(e,t,A){t.Z=A.p+"assets/images/deployed-contract-aptos-c83f9797b55d61e51f46bee3e1dcdf3e.png"},40432:function(e,t){t.Z="data:image/png;base64,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"},93803:function(e,t,A){t.Z=A.p+"assets/images/template-code-aptos-b60550838f33b8ae7a3d9d3e86daa2f9.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/399fe57e.e43e4308.js b/ko/assets/js/399fe57e.e43e4308.js deleted file mode 100644 index 99144dc20..000000000 --- a/ko/assets/js/399fe57e.e43e4308.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[1584],{3905:function(e,t,A){A.d(t,{Zo:function(){return C},kt:function(){return d}});var n=A(67294);function o(e,t,A){return t in e?Object.defineProperty(e,t,{value:A,enumerable:!0,configurable:!0,writable:!0}):e[t]=A,e}function a(e,t){var A=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),A.push.apply(A,n)}return A}function l(e){for(var t=1;t=0||(o[A]=e[A]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,A)&&(o[A]=e[A])}return o}var r=n.createContext({}),i=function(e){var t=n.useContext(r),A=t;return e&&(A="function"==typeof e?e(t):l(l({},t),e)),A},C=function(e){var t=i(e.components);return n.createElement(r.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var A=e.components,o=e.mdxType,a=e.originalType,r=e.parentName,C=p(e,["components","mdxType","originalType","parentName"]),c=i(A),d=o,s=c["".concat(r,".").concat(d)]||c[d]||m[d]||a;return A?n.createElement(s,l(l({ref:t},C),{},{components:A})):n.createElement(s,l({ref:t},C))}));function d(e,t){var A=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=A.length,l=new Array(a);l[0]=c;var p={};for(var r in t)hasOwnProperty.call(t,r)&&(p[r]=t[r]);p.originalType=e,p.mdxType="string"==typeof e?e:o,l[1]=p;for(var i=2;i\n \u251c\u2500\u2500 Move.toml\n \u2514\u2500\u2500 sources\n \u2514\u2500\u2500 YOUR_CONTRACT_FILE.move\n")),(0,a.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": ",(0,a.kt)("strong",{parentName:"p"},"PROJECT TO COMPILE")," \uc139\uc158\uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ud504\ub85c\uc81d\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": \ucef4\ud30c\uc77c \uc635\uc158\uc744 \uc120\ud0dd\ud55c \ud6c4 ",(0,a.kt)("inlineCode",{parentName:"p"},"Compile")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": \ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub418\uba74 \ucef4\ud30c\uc77c\ub41c \ubc14\uc774\ub108\ub9ac \ud30c\uc77c\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4."),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"PROJECT TO COMPILE")," \uc139\uc158\uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ud504\ub85c\uc81d\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\ucef4\ud30c\uc77c \ubc29\uc2dd\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("strong",{parentName:"li"},"Complie")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4."),(0,a.kt)("li",{parentName:"ul"},"\ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub418\uba74, wasm file\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.")),(0,a.kt)("img",{src:A(3795).Z,alt:"aptos-compile",style:{width:"318px"}}),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"\ubc18\ud658\ub41c wasm \ud30c\uc77c\uc740 ",(0,a.kt)("inlineCode",{parentName:"p"},"aptos//out")," \ub514\ub809\ud1a0\ub9ac \uc548\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4."),(0,a.kt)("p",{parentName:"admonition"},"\ub2e8, \uc218\uc815 \ud6c4 \ucef4\ud30c\uc77c\uc744 \ub2e4\uc2dc \ud574\uc57c \ud55c\ub2e4\uba74 \ud504\ub85c\uc81d\ud2b8 \ub0b4\uc758 ",(0,a.kt)("inlineCode",{parentName:"p"},"out")," \ub514\ub809\ud1a0\ub9ac\ub97c \uc0ad\uc81c\ud558\uace0 \ub2e4\uc2dc \ucef4\ud30c\uc77c\ud574\uc57c \ud569\ub2c8\ub2e4.")),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"\ud604\uc7ac \uacc4\uc815\uc5d0 \ucda9\ubd84\ud55c APT(\uc57d 0.3APT) \uc774\uc0c1\uc774 \uc5c6\uc73c\uba74, \ud2b8\ub79c\uc7ad\uc158\uc5d0 \uc11c\uba85\uc774 \ubd88\uac00\ub2a5\ud55c \ubc84\uadf8\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc6d0\uc778\uc744 \ubd84\uc11d \uc911\uc774\uba70, \uace7 \ud574\uacb0\ud558\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. \uac1c\ubc1c\ud558\ub294\ub370 \ucc38\uace0\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.")),(0,a.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"WELLDONE Wallet\uc5d0\uc11c\ub294 \ud574\ub2f9 \uc9c0\uac11 \uc8fc\uc18c\uc5d0 \uc5f0\uacb0\ub41c \ub124\ud2b8\uc6cc\ud06c\ub97c \uc790\ub3d9\uc73c\ub85c \uac10\uc9c0\ud558\uc5ec \uac00\uc838\uc635\ub2c8\ub2e4. \ub530\ub77c\uc11c Deploy\ub97c \ud558\uae30 \uc774\uc804\uc5d0 \uba54\uc778\ub137\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\ub0bc \uac83\uc778\uc9c0, \ud14c\uc2a4\ud2b8\ub137\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\ub0bc \uac83\uc778\uc9c0 \ubbf8\ub9ac \uace0\ub824\ud574\ub450\uc5b4\uc57c \ud569\ub2c8\ub2e4.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": \ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub41c \ucee8\ud2b8\ub799\ud2b8 \ucf54\ub4dc\uac00 \uc788\ub294 \uacbd\uc6b0 ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," \ubc84\ud2bc\uc774 \ud65c\uc131\ud654\ub429\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": ",(0,a.kt)("inlineCode",{parentName:"p"},"Deploy")," \ubc84\ud2bc \ud074\ub9ad \ud6c4 WELLDONE Wallet \ucc3d\uc5d0\uc11c\xa0",(0,a.kt)("inlineCode",{parentName:"p"},"Send"),"\ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158\uc5d0 \uc11c\uba85\ud569\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:A(95073).Z,title:"Deploy",width:"1802",height:"1758"})),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 3"),": \ucee8\ud2b8\ub799\ud2b8 \ubc30\ud3ec\uac00 \uc131\uacf5\ud558\uba74 \ud130\ubbf8\ub110\uc5d0 \ud2b8\ub79c\uc7ad\uc158 \uc131\uacf5 \ub85c\uadf8\uac00 \ucd9c\ub825\ub418\uace0, \ucee8\ud2b8\ub799\ud2b8\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Deploy",src:A(82333).Z,title:"Deploy",width:"1768",height:"2002"})),(0,a.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,a.kt)("admonition",{type:"info"},(0,a.kt)("p",{parentName:"admonition"},"\ucee8\ud2b8\ub799\ud2b8\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95\uc5d0\ub294 \ub450 \uac00\uc9c0\uac00 \uc788\uc2b5\ub2c8\ub2e4."),(0,a.kt)("ol",{parentName:"admonition"},(0,a.kt)("li",{parentName:"ol"},"\uc704\uc758 \uacfc\uc815\uc744 \ud1b5\ud574 \ubc30\ud3ec\ud55c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc790\ub3d9\uc73c\ub85c \uac00\uc838\uc624\ub294 \ubc29\ubc95"),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("inlineCode",{parentName:"li"},"At address")," \ubc84\ud2bc\uc744 \ud1b5\ud574 \uae30\uc874\uc5d0 \ubc30\ud3ec\ub41c \ucee8\ud2b8\ub799\ud2b8\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95"))),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 1"),": \ud604\uc7ac \uacc4\uc815\uc774 \uc18c\uc720\ud558\uace0 \uc788\ub294 \ubaa8\ub4c8\uacfc \ub9ac\uc18c\uc2a4\ub4e4\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc73c\uba70, ",(0,a.kt)("inlineCode",{parentName:"p"},"Get Resource")," \ubc84\ud2bc\uc744 \ud1b5\ud574 \ud574\ub2f9 \ub9ac\uc18c\uc2a4\ub97c \uc77d\uc5b4 \uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,a.kt)("img",{src:A(88916).Z,alt:"view-aptos",style:{width:"318px"}}),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Step 2"),": \uc6d0\ud558\ub294 \ud568\uc218\ub97c \uc120\ud0dd\ud558\uace0, \ud544\uc694\uc5d0 \ub530\ub77c \ud30c\ub77c\ubbf8\ud130\ub97c \uc785\ub825\ud558\uba74 \ud574\ub2f9 \ud568\uc218\uc758 \uae30\ub2a5\uc774 \uc2e4\ud589 \ub429\ub2c8\ub2e4. ",(0,a.kt)("inlineCode",{parentName:"p"},"view")," \ud568\uc218\uac00 \uc544\ub2cc ",(0,a.kt)("inlineCode",{parentName:"p"},"entry")," \ud568\uc218\uc758 \uacbd\uc6b0\uc5d0\ub294 \ud2b8\ub79c\uc7ad\uc158 \uc11c\uba85\uacfc \uc694\uccad\uc774 \ud544\uc694\ud558\uae30 \ub54c\ubb38\uc5d0 WELLDONE Wallet\uc5d0\uc11c\uc758 \uc11c\uba85\uc774 \ud544\uc694\ud569\ub2c8\ub2e4."),(0,a.kt)("img",{src:A(61133).Z,alt:"entry-aptos",style:{width:"500px"}}))}d.isMDXComponent=!0},3795:function(e,t){t.Z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUIAAACXCAYAAABgKVK0AAABR2lDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf87AyCDPwMUgwGCamFxc4BgQ4ANUwgCjUcG3a0DVQHBZF2RW1bOzfl6Tz5YWLXVZe9DWdS2mehTAlZJanAyk/wBxWnJBUQkDA2MKkK1cXlIAYncA2SJFQEcB2XNA7HQIewOInQRhHwGrCQlyBrJvANkCyRmJQDMYXwDZOklI4ulIbKi9IMAT6hMS5O+nYGxkbkHAuaSDktSKEhDtnF9QWZSZnlGi4AgMpVQFz7xkPR0FIwMjYwYGUJhDVH8OAoclo9g+hFj+EgYGi28MDMwTEWJJUxgYtrcxMEjcQoipzGNg4G9hYNh2qCCxKBHuAMZvLMVpxkYQNo89AwPr3f//P2swMLBPZGD4O/H//9+L////uxho/m0GhgOVADm7YYlwl7tjAAAAYmVYSWZNTQAqAAAACAACARIAAwAAAAEAAQAAh2kABAAAAAEAAAAmAAAAAAADkoYABwAAABIAAABQoAIABAAAAAEAAAFCoAMABAAAAAEAAACXAAAAAEFTQ0lJAAAAU2NyZWVuc2hvdEbIG2cAAAI9aVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA2LjAuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4xNTE8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpVc2VyQ29tbWVudD5TY3JlZW5zaG90PC9leGlmOlVzZXJDb21tZW50PgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MzIyPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CihMMSYAACEHSURBVHgB7Z0HfFRV2sbfkEYgJPROSCCQkBB670VAit3V1V1ZFQEX61rXtuu6rqsioqyigouua3c/G6JSpEW6tNBCaIEECIQ0aiAk+c5z4h0mk8lMMoVMeQ6/Yeaeds/5n9xn3nPec+cGdIjrWyq/hoZNGktWZqZxyHcSIAES8AsCtfyil+wkCZAACdggQCG0AYdJJEAC/kGAQugf48xekgAJ2CBAIbQBh0kkQAL+QYBC6B/jzF6SAAnYIEAhtAGHSSRAAv5BgELoH+PMXpIACdggEGQjjUkkUI5AnTp1pGNCRwlT7+HhdSX7+AkpyMuXzIxMKbpQVC4vD0jAmwhQCL1ptGqwrW3atpFuvbpLZP0IUyuatWimP2cfz5Ztm7dJ+46xElo7VJZ8v9iUhx9IwBsIuFwIA2oFSOs2reXc2XNSUlqiLIYCKS4u1ixCQkMkIqLsQrp48aIUFBRIaYnpxhadp15EPanfoL7knMiRs2fOWmWI9JMFJ6VU/WvUqFG5PKdPnZbCwkIdh7Y0VnfLhISEKOslWy6cv6DjEWcZzp49W+58derWEVhAluFE9gkdFRAQIA0aNZCwsDA5fuy4TYuosnYYdUM8mjZrKqdOnpJ8ZWEZAbxQf0F+gRGl3xGPtiEvPjdr3kzz1kxV3tLSMqbh4eFyoeiC7jeYoR4jzagQ8UFBl/4Mzp8/r9thpOO9bUxbGTxisI46evioHErPkJOqroj6kdIuNkaaNGsiQ0YO0fVkHT1mXpSfScArCAQ2atz6WaOlYeriP33ypHHo0HtoaKiMu3aclJSUCCyGnn17atHCRd4qqpX07NNTX7wt27SU7srCOKYunMJzhQJhGTJiiERFR+nzJiQlSMNGDeVI5pEK7Rh55Uh1MR6SwMBAufLqK/U78uJlCBoEBGm1a9fWVkrP3j0lNzdXzp07J0ndknTezl07S3i9cImIjJDii8W6ncbJmrdsrgWgRasWEp8YL8HBwab2QLjGXDVGINr4jD6dLzxfTsSMeiprhyHyqLt3v976/Oh7fOd4Obj/oOYHXqPHj5Zd23fpY6POHn16SLee3XQ88gwdOVSno3xS9yQ5nHFYLly4IF17dhX1XaH7dcW4KyR9f7rpS8moC/FhdcOkQcMGun8Q7bycPCNZIhtEyqhxo/TxjpQdsnrlaslVX1JnTp/R7/vS9uk0cEI4reL379mvP/M/EvAWApdMARe2OC83T9avXq9rhDj1H9xfX5yIyDqaJb+s/UWnte/YXovMmuQ1EpcQJ7BoVi5dqdMgjMNHD9didPDAQR1n7T8IyrpV6yok9R3UV7Zt2Sbp+9J12oG9B6TPgD6yaMEiU37Uv33LdsnNya1QPuNghuDVqHEjLS7m5+g3qJ+kbk+VfXvKRGBnyk4tjLAMDYEzKrTVDrCJVdPJH+f/qPuOMoldEwVCZ/BDXLsO7WT3zt34qEUfrHKyc/Qx/kvdkWpi2qlzJ83UYGzKZOPDxnUbTdayZTZYgwjHj2XL5g2bLZNl0LBBEt0+ukI8I0jAmwi43WuMqVZgUKBVJrVq1ZKiorJFdliPe1L3mPJhCrd3915tVZoirXxAHbXDaptesGgQIGCwrIyAaSRE0BUBde/fe8nqwVQclmuTpk0qVG+rHU2bN9VWGr4AjLA3tXyfIXIxavppBIjOjq07KkxxjXRYpuZTXSPe1jusZoOhZdm6yimC6e5OZQ1aC/iySNmUYnrt2ZVmLRvjSMCjCbjFIsQ0q32H9hIcEiwx7WMkzeziaNWmlb7oMIXG2l3ysmQNCOtZmG6ZhzNnzgguRFsBa3mwOI0ASwjCBHGxXA8z8jjzjj5hzdOybrTdsq3Ia6sdmJabW3ZoF744MN02Aryx+bn5AtE8nnVcc4UFbTgqkA9WG6azdcLraN6YvlYn9O7f2zT1xlQXyw5GWLNyjfHR6rsta91qAUaSgAcScIsQop9BwUFSUlyip3hwfBghW02xMGVtF9tO54FzAyE/P18tvkfoNT4jb2RkZAVHgZFmvKP8skXLjEPTOyxFrCEajhokYLptKWCmAlX8AGGC1WlZd6RyHJgLCKpDXlvtgJWKPpsHiOmZU+W/EHbv2i2JSYlaVCG4hjPIKAfWeGFavvTHpWqdroypkW7vHV9GhiPJMi/W/swtXThcrIlf66jWgmk5zm1PPC3PwWMSqGkCbpkaY40Qa1ppqWna+2veSSziw3Gyfet2wcUDqwghQ3kiu/ToooUDx3BOwGGCqRcEbOCwgfodwhJWJ0xbTshXWYDDAM4QI8Czaiz6G3GOvmcezNRtNcrDAobFBs+0ZbDVjqzDWRLdLrqcJdmtV7cKggprD33u0r1LOevaOBesOPDGe3VF0KijsncwxLgYrzbRbaxmTeySqK3U3BMV11utFmAkCXgQAbdZhPb6CEsNYti9d3dJXpqsL354YcdfN15bhdgesnPbToEFiYDtOGOvGasFEhaSse0GHt/x1443nS5lc4oWTzgAIJ7wYMPaCVYW06oV1Zsymiq1+LBp/SYZMKS/biusPlhj6IM1q8pWOyBacIoMHzVcW3lYp4MXHd5Zy7A3ba8kdE7QYosptyNh9LjRJosYa5zwRiOYx0O4t2zcYrV6vRao+FqGXmpqjS00CNa8/Jb5eUwCnkYgwBN/oRrWD4TPMkAosM3FcLBYpls7xuI/XpbTSWt5qxsH6xTrnFWp2147sM2m8HyhSeCr2xZ35YcVjfVIrHWiDxA6vGD1wxLGmq+xdQZfBtamze5qG+slAVcRqDGL0FYHrIkg8mO/YXUDLmC83BGwV7IqIohz22sH9jd6aoD3HRYkpuYtW7fUL/O2FuSflC2/bNaWuHk8P5OAtxDwSCH0Fnj+0M7FZrfLYZmiddvWeuM1rMGzymo/q5w3WJ/ERnYGEvBWAhRCbx25Gmg3HF24a4R3jtQAfJ7SrQTc4jV2a4tZOQmQAAm4mACF0MVAWR0JkID3EaAQet+YscUkQAIuJkAhdDFQVkcCJOB9BCiE3jdmbDEJkICLCVAIXQyU1ZEACXgfAbdsnwmPUL96HOiWqr2PMFtMAiTgNgIXiy+qH5O+9Kvujp7ILRYhRdDR4WA5EiCB6hBwlda4RQir0xHmJQESIIGaJkAhrOkR4PlJgARqnACFsMaHgA0gARKoaQIUwpoeAZ6fBEigxglQCGt8CNgAEiCBmiZAIazpEeD5SYAEapwAhbDGh4ANIAESqGkCFMKaHgGenwRIoMYJUAhrfAjYABIggZomQCG0MwJd1OMs66qHyLdp01rato2yk7vy5ISEeGmoft4eob56BnJn9UQ6V4Sq1GV+bmfP6QwHZ9qBpxD2699HP0/a2T6wvGcTCA4OUU+dDLmsjfQZIWzcuJF07BjrUngR6vGiTz/9uKozQEaPHiHjxo9xuP5Jd90undVD2hHi4zvK3X+8y+G6zAtWpS7zc5uXdeSzMxycaUdMTIw8/PD96svI+nOVHekLy3gmgUEjJsigEZce0Xs5WukzQti7T0/BhebK0KlTvBw6lCFnzpxxZbWsywECaWl7ZMqU+2T//nQHSrOItxDo0XeoRNZvqF6NpEefIZet2R7zEzGNlEU3adJE6dQpTgnPWfn55zXy2af/0w8kHzCgrwwcNEBWLF8pt028VULVs4TXrf9F/vP+R/oxmTfdfINcOeYKwXOP//XGDPn8sy8lOXmVhIeHy0SVv2u3JP2UtXXrfjHVCcJdunSW3/3uZmnZqoVkZh6W9+Z9KLjgjJCQGC+7dqYah/od57riiuGCx29+9dV8Wb5spSkd7Rw7drSuL0U9pP2/H3wsuer5v/aCvXbaK4/0rl2T5PY7bpN69cJl4y+b5L33Pqz0UaPt2kXLjb+5TrPOVA90X7x4qaxcucp0mpiYtir9eklU0/nj2dky/9sfNE9TBrMPYxR3TFlfmf6aHjcwGHPlKL2MkJ5+UI3Rh3LgwEFTCYwdLLskZR0fzcqSd+e+L/v2HdDptv4GGjSoL88997T8+fFn9Hn+/vxfZP7872XEiKHSsUOsbNy4Wb7+5js5rJ65zOCdBOI795Co6A6mxkfFdFTX7WlJ3b7JFOeuDx5jEf7pT/cKnhP8zxdekU8/+UIL29Chg3S/8fBzCOT4CWNl7tz35N1335fu3btqkUOGpT8tl2VKJI8fz5aZr74hW7emCB6+jguuSZPG8q9Zb8knqs7BgwfILbfepOuE+Dz51KOycOESefihJ2TTpq3y5JOPqLWJYJ2O/7CmtcNMCHv16q7Sg2T6yzNV/i3yRzW9bdGyuc6PvNPumSIrVvwsL780Uz8M/eFHHrC7pmWvnabG2PgQEREhEGgI7+w350isEoapU++0WgKP4fzzE49ITk6uvPCP6UrgVsvUuydpnigAwXlCpRfkF8gLL0yXZUrop90zWQutZYUDB/aX62+4Rt55+99anCBu9953t6xbu0HV/bJkZGTK3557RouzURb5we7ll1+TU6dOyyOPPmgkia2/gVqBgdK8eTM9rijQtGkTue22WyR55WqZOfMNfYwvNQbvJpC6Y5OYvy5XbzzGIpz1+mxtPeFB6Glpe5UzIVGL3/LlyZpFeHhdLWgnTuToYzxT9+lnHpcP1MWPOLzOn1ePm9xfZl3ExraTDmrN8O6p98vp06d1GTw4/gkldhDaqKjWWnhXr16nLacvPv9SWZzJ2gJFZjhIoqLalLMIT2TnyEcffqbr2qseeD582BDpoETn6JEsueaaCfLtNwtkyZJlOn3//jdlztw3dHpq6m4dZ+0/WGe22okvB3shTFnCECNM4xFghU5/5R8yb94HWmzMy+PLIDv7hMz79we6r3v27NNOnAlXjZXNm7fK4CEDJUeVxxdOaWmpHgtwwxeHeYAF+oc/3KqstBclK+uYTkIdP/6wWL7/fqE+Rt1n1HOPIVoQPYQ1ijfEFQHPQkY7YQnmqPGz9zegC5n9h3pWrVqjY9BWCDy+yIqKisxy8aO3ELgcll9lLDxGCPPy8vR0qV37GImoV09GXjFMT3eMhuPiNUQQcbt379HWQevWLSU9/ZCRzfQeHd1WDh8+YhJBo0xQUJC0atVST8eOqQeWvzrzRT0N36SmVqmpaaby8fFxcvRolhQUnDTFZWRmmj7jwks/eEjgUEHo0bObuqAbSmhoqCkPxCM6OkrVW7kQ2msnrCp7AUsJhggiL6akhYWFWsh37NhVrniM4pKm2KH9RkC/R48eqQ9jYqIlddfucunGl5GRH0sKmJK+qaxPLCkYISYmWhYv+sk41HV8qpY3zIN5fw4qfmhHpGIIIbT3N2BeDz5nHLrEBtPv0NAQbdFiZsBAAtUh4BFCGKimPX999iktKrBK8vLytSVRfLHY1Bc8XNw8FBcXC14hIZeExzw9tHaoWCsDCwsXzPnz5/V608CB/aRnz+5ylbJmdqpp8Iv/fEVZFBfF2vpgcXF566y05JKY4Nz5ajp5Vq0dGuGbr79TAnXpYjXizd/ttdM8b2WfLfuJfEUXisqJslEW5ztvwfKCyhuimAQEBCieIXYtKnjoIZ43qGkupsFYL0UI0dbYReNUVt+LzSxcczGuyt+AZYXm1rJ5XZb5eEwC9gh4hBB26NBeMEWcfNc9eq0JjYalFxx0ab2uRYvmvwpYmSDCqsPFk5FRNh1EGay3GSFdWQg33nitzgPBRIBTBBe7IU4Qw6VLV+gXpm+vz5oucXEdZfv2nXp9cMGCsimeUaetd4johvUb9ZqjrXyWaVVpp2UZy2Os60VGRpisVxzXU1aWuZVolMH5YhRr8xDVtrUY1tmBA+kS1/HSgjXytVHLCBiL/fvLlh3giHpr9lx5/vm/yrRpk2XGjFm6ugPKEoWjZevWbabqExI6qal4tp6OmyKtfKjK34CVYozyIQKDhlvfMvPzsgVu7+Ul5XD7qSo/wWm1joS1HUwTIVRYdO/Vq2e5AvjGnzzlDr12h03Ed945UV9w584V6nxHDh9VU94W0qx5U10H1vBQ78SJtwrW0CAOkyb9QTZs2Kgtxd69e8rs2TN1flRQp06YLodpVe3atdUFHV1ufRB5bAWsVd2ghBdTYfQB+/vmzXtLYmPb2yom9tpps/CviRB6sKmnlhTwumvyHYL1OfOlBKOe9Uqsk5I6yyC1VogvErT3xhuv08sDyLNeedY7JcTpqS/SsU767LNP6jVVow5YzHhBAJPUNHnsuNE6KVl5nq+97mrdZ5Tt37+vsvSfKPcFZdRh+V6VvwHLMjz2LQKH0vdI46Ytyr0QdzmCR1iEWGf6+uv58tTTj+k1o11qjQpWB9YKjXDoYIZA7N6Z84byyAYqkdqtFtffMpK1FbdNbVmZMeNF7T1duHCJ9oree99Uefffs7VjBJbKv2a9rcvAc9mlS6K8+uqLampXJqbvvvsf7XmGIwAiAs9qVcOihT8psW2g+4C1QdT5ycefK6HbZ7MKWKXw3lbWTpuFf01EW1NStsvst2bqLxSI64xXXrdaFOuHs15/U25VHtZ7752qnRhw8Pzw/SKdH1bka8oL+7vf/1amKM8zHA/om/n2GqNifGnMfvMdeVB5/Pek7dWWNbzSjz32oEQoCxUOEnjsjx07bhSp9L0qfwOVFmaCTxA4dCBN6tQNl/jEHro/8B4j7nKEgA5xfU0LXQ3VVpMsM4eAow2o36CxQ0XhyICzwXID88iRw/Ri/uNqDxnyYAuLIV6WJ4IlgrUj8zUj1AlvtDFFNi+D6TQ80idPnjJFY4tNQ2VBwhngSIADBSJg3oaq1GPZTkz/W6klgspCbk5eOaFF37HGZ6zZVVbOiIdnHI6WykLdunW1Z7e6/UB9+DIwvPWV1W8tvrK/AWt5GeebBLCpGmHTuhVV6mB+3okq5bOVySMsQqOBECu8bAV7eayJHayuygJE01wEkS9B7Vn8Sa0dOhos66tqPZbtxN7JkWrzdmVh27Yd5YQQfa+qCKJOWyJYlu74HTWOiCDOaW98kYfBtwlUVQBdScGjhLCyjmGqV2RHICsr60j8mrXr9Z46R8q6sgymrMa+RFfWy7pIgATKE/CoqXH5pvGIBEiABOwTcMXU2CO8xva7yhwkQAIk4D4CFEL3sWXNJEACXkKAQuglA8VmkgAJuI8AhdB9bFkzCZCAlxCgEHrJQLGZJEAC7iNAIXQfW9ZMAiTgJQQohF4yUGwmCZCA+wi4RQgvFtu+O8R93WHNJEAC/kTAVVrjljtLTp/M96exYF9JgAS8nIBbLEIvZ8LmkwAJ+BkBCqGfDTi7SwIkUJEAhbAiE8aQAAn4GQEKoZ8NOLtLAiRQkQCFsCITxpAACfgZAQqhnw04u0sCJFCRAIWwIhPGkAAJ+BkBCqGfDTi7SwIkUJEAhbAiE8aQAAn4GQEKoZ8NOLtLAiRQkQCFsCITxpAACfgZAQqhnw04u0sCJFCRAIWwIhPGkAAJ+BkBCqGfDTi7SwIkUJEAhbAiE8aQAAn4GQEKoZ8NOLtLAiRQkYDLf5i1uLio4lkYQwIkQAJuJBAYGOxU7S4XQmcb5FRvWJgESIAEHCDAqbED0FiEBEjAtwhQCH1rPNkbEiABBwhQCB2AxiIkQAK+RYBC6Fvjyd6QAAk4QIBC6AA0FiEBEvAtAhRC3xpP9oYESMABAhRCB6CxCAmQgG8RoBD61niyNyRAAg4QoBA6AI1FSIAEfIsAhdC3xpO9IQEScIAAhdABaCxCAiTgWwRcfq9xrQDfAsTekAAJeBeBktLqt9elQhgUUCq7A1Kq3wqWIAESIAEXEChRdcRJV6muGLpUCNGPQBd0hlWQAAmQwOUk4HIhROOL1SuhpIsUc5p8OceS5yIBvyUQXFoqu2ptc7j/bhFCUQKYds19qlFUQodHhgVJgATsEgi4WCQNt62Q+hk77ea1lYFeY1t0mEYCJODRBEqDgiUvaajTbaQQOo2QFZAACdQkgRIlhs4GCqGzBFmeBEjA6wlQCL1+CNkBEiABZwlQCJ0lyPIkQAJeT4BC6PVDyA6QAAk4S4BC6CxBlicBEvB6AhRCrx9CdoAESMBZAhRCZwmyPAmQgNcToBB6/RCyAyRAAs4SoBA6S5DlSYAEvJ6Ae+419nos/tOBa5LaSlzTSOnWqqHUCgiQbUfyZO+Jk/LdjkNy5sLFaoOoFxosLSPryJ7sk+qnkBz4Ybhqn7HqBRrXrS0Te8fK++v3SO7Z85LQvL70a9tU5q1Lq3olzOmTBCiEPjms9jt1Y9douX9oogxu17xc5pu7lx0u33tUHvt2g2w4lC2f3z5CDuaelke/XV8ur/nBtEGdlMh0kJ5tGklQrVpyVonofCWmkz/9WU6dLzLPWmOfh8Y2lxnX9pXdxwtkwc4MGdK+ubxyTV8KYY2NiOecmELoOWNx2Vry0PDOMkMJgBHyz12Q9NxT+scs29SvK03Ca8uw2Bby1aSRsvrAcflNtxiBMFYWHlCC+tp1/eSzzfvl6QW/yM5j+TKoXTN556ZBsuZPV0mvGd9IYRF+nK1mw/9tTZfo5z7Tol6zLeHZPY0AhdDTRsTN7blNTQ0NEdyRlSezVu6UOatTy531kRFJMv3qPtIqsq4WwXKJFgf1w0Lkb1f2kLXpx+XWD5abpsOfbz4gmflnZdUDE+TqzlGCY08IsGwZSMCSAIXQkoiPH/9ldNncFyJ40/tLZWdWfoUev7J0m/SJamJXBFGwX3RTiVRiOO1/q00iaFS4+sAxmbtmt3RsEmlESXTDcHlyVDcZFddKiktKZPHuI/L3RZvlSMFZnadH60by0W3D5LcfLJN/jO8lg2KaScrRXLnz42SpGxokb9wwQK9nbj+aJ/d/uVZP3VFw3i2DJevUOWXBHpMXr+otLSLqyKLUw/LC4i2yTeVFSGzeQP53xwgZN2eRHMg5peMs/8N0+b4hCTI8tqUqlyv/3bCXU2dLSD54TK+xDw5qZV0aoEQltkmETp6uxM6aCCIRa4KYDlcldGnZUDtVthzOsZp9ymc/y/OLtui0iNrB8t2U0VpkX/4pRV5fuUOv082fPFrqhJR9J+M9vll9maOm1cv2HJUHv1orUfXDlYCNlE8nDpevUtJl2herJaJ2iMyfPEqUf0eHqAbhMiExqmzNb22aPKWm6J1UPai7QZ1QnScsOFDXHRpk/YEScJ6gfQgPfLlGNmackLm/HSS39Giv4/if7xKgRei7Y1uhZ6PiWorhyF1hY80P00fLNUHLY6NyCOEutSZo1GvEW3t/cGhnaVYvTJJe+lKyTp7TWb7dfkhSHrte7h4QL68u324q9t76NHl7VdmUHWuYX026QqZ+vso0jT9y8qwsmTZWOjSOlLTsAl2uoxJ5rEfCWkT4Ztsh2fb49fLQsM7yzPcbdZyt/16/vr+s2n9MW8roz0cb90nhxWKZdUM/+WTTPltFmeblBCiEXj6A1Wn+337cLHjZC7a8w5ZlYWWdK6raNpuebRprK88QQdQF0V2lprNIMw/L92aZDtN/Xddbd/C4KW7/r1PbpvVqm4Rwc2aOSQSR8agSy6V7jkh3Nd2uShiuHET/XLJV2igL1AgpR3IF227gRMrIP2NE893HCFAIfWxAL3d3IBT3DU6s0mkx9fxiS0WnyV6153Bw+2bl6ii0Iq7FZs9oLLVigmL/o2VA3E1VmOZj72Ogeij306O76ZdlPZ1U2ymEllR855hC6DtjabcnzyrvLvbSmYc0tacOU05rAY6NA3+5WSfBknz2x00Vsm09nCuN6oZWajFh6oyN2lhDPJR3WloqJ4ZlgAgdynPe2kI9lgHnq4qAZZ8uVM6bUpn0abLeBmRZz4WLeGIug68SoLPEV0fWSr8ggtgfaP4yHAlWsut8Rjw2R1sLa9V0tUCt4c3+zYAKydiPiO0zY+Jb6bRNGTkyUO0vNHdW1FXOkb5tm8imzBMVylc3okfrxtLwV8cIyuI82M8Iq9VeKCouka0qH+40wZ5H4xWsNoejXvM226uL6d5HgELofWPmshZjmootNNYCtpo8OqKLToIzBB5UawHrfbeorS7jEtrIe7cOkeEdWmiHyNhOrSX5/glyVk1xsYUGYc6aVGkQFqryDVZbYBrpdcH//n6YvhPlvXV7rFVfrTiI2WfK440tPbBEcR44Z96x2CdZWaUvqvXBKQPiVL+TpH3jCN2+b+4aJe+rfl0orvkN4ZW1m/HOE+DU2HmGXlsDtsjcPTDe5J01OjJFeXAfVHeLYPsJwktqq4ut8MOuTJn0SbLcOzhBe3IxFb6o9gguUXsEh7+RrO/rRXncf3zV3EVqi0sfWf/Q1aIcswIHyPg5C/W02dY5qpL2vbptDrfPLb1nrIQFB+n9g9jkXdk2Ics68cWAaf79QxLlZbWhHMuQS9IOy5i3f9TTZsv8PPYdAgEd4vri71GHhk0aS1ZmpnFY7feggFLZG5AixWpvV9CEuao8H/BebYhuLLDs3nF6uosLfqDaU2isqZ04UyiH1V0gtZSzIEp5R7FB2giPqfuLseewqgFCEt2wnmDDtq3b6jAlxh8e7kl2RcBWmkzl1b3945USHFhLItU+Q/TL0QBPMaxZV7XP0XawXNUItP92Vpn2qOwdSrvq20WrVrIsFy3C6tDy8rxwjMApgOkwNle/pO7AwBoaLnq8zEPyviy94Rn351Yn5Jw5L3jZC478so29Oo10TJGdEUHU42x5oy189w4CFELvGCeXtNLcO4xb0ca+s1DfB5ygpsBxzSL1t+hOZcnBufBVykGXnPNyVYJtMsfULXYMJOAIAQqhI9R8pMxp9fNYH6u7J3wh3F3JFiBf6Bv74H4C9Bq7nzHPQAIk4OEEKIQePkBsHgmQgPsJUAjdz5hnIAES8HACFEIPHyA2jwRIwP0EKITuZ8wzkAAJeDgBCqGHDxCbRwIk4H4Cbts+U6u0REoCqLPuH0KegQRIIBC3KTlxI5tbhBCNurBgKkeHBEiABC4PASdtLrcIIXquFfryIOBZSIAESMApAi4VwoulARIrZT/d5FSrWJgESIAEHCRg9kPmVa7BpUKIs0IMGUiABEjAmwg4ObP2pq6yrSRAAiRgnQCF0DoXxpIACfgRAQqhHw02u0oCJGCdAIXQOhfGkgAJ+BEBCqEfDTa7SgIkYJ0AhdA6F8aSAAn4EQEKoR8NNrtKAiRgnQCF0DoXxpIACfgRAQqhHw02u0oCJGCdAIXQOhfGkgAJ+BEBCqEfDTa7SgIkYJ0AhdA6F8aSAAn4EQEKoR8NNrtKAiRgnQCF0DoXxpIACfgRAZf/DFdxcZEf4WNXSYAEPIFAYGCwU834f9riTFQub7KGAAAAAElFTkSuQmCC"},61133:function(e,t,A){t.Z=A.p+"assets/images/entry-aptos-3fb256ecc3e8d6ef9ef37f5a37f5fa00.png"},88916:function(e,t,A){t.Z=A.p+"assets/images/view-aptos-3c614c0885eaf3156e182181894e54eb.png"},95073:function(e,t,A){t.Z=A.p+"assets/images/deploy-aptos-8294285811a4f4ae840a8904925c99f7.png"},82333:function(e,t,A){t.Z=A.p+"assets/images/deployed-contract-aptos-c83f9797b55d61e51f46bee3e1dcdf3e.png"},40432:function(e,t){t.Z="data:image/png;base64,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"},93803:function(e,t,A){t.Z=A.p+"assets/images/template-code-aptos-b60550838f33b8ae7a3d9d3e86daa2f9.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/3cd63f6d.0aa37e95.js b/ko/assets/js/3cd63f6d.0aa37e95.js deleted file mode 100644 index f86e7b5cc..000000000 --- a/ko/assets/js/3cd63f6d.0aa37e95.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[1362],{3905:function(e,t,n){n.d(t,{Zo:function(){return s},kt:function(){return d}});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},s=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},A=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,p=e.originalType,l=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),A=c(n),d=r,u=A["".concat(l,".").concat(d)]||A[d]||m[d]||p;return n?a.createElement(u,o(o({ref:t},s),{},{components:n})):a.createElement(u,o({ref:t},s))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var p=n.length,o=new Array(p);o[0]=A;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var c=2;cExperimental",id:"2-cargo-near-compile-for-rust---experimental",level:3},{value:"3. EMBED-ABI Compile (for Rust) - Experimental",id:"3-embed-abi-compile-for-rust---experimental",level:3},{value:"4. AssemblyScript Compile",id:"4-assemblyscript-compile",level:3},{value:"5. JavaScript & TypeScript Compile",id:"5-javascript--typescript-compile",level:3},{value:"Deploy the Contract",id:"deploy-the-contract",level:2},{value:"Execute the Contract",id:"execute-the-contract",level:2}],A={toc:m};function d(e){var t=e.components,i=(0,r.Z)(e,o);return(0,p.kt)("wrapper",(0,a.Z)({},A,i,{components:t,mdxType:"MDXLayout"}),(0,p.kt)("h1",{id:"near"},"NEAR"),(0,p.kt)("h2",{id:"create-the-project"},"Create the Project"),(0,p.kt)("p",null,"NEAR\ub294 AssemblyScript, Rust, JavaScript, TypeScript\ub85c \uc2a4\ub9c8\ud2b8 \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac01 \uc5b8\uc5b4 \ubcc4\ub85c \ucee8\ud2b8\ub799\ud2b8\uc758 \uad6c\uc870\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 WELLDONE Code\ub294 NEAR\uc5d0 \uc785\ubb38\ud558\ub294 \uac1c\ubc1c\uc790\ub4e4\uc744 \ub3c4\uc640\uc8fc\uae30 \uc704\ud574 \ub450 \uac00\uc9c0 \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4."),(0,p.kt)("h3",{id:"create-template"},"Create Template"),(0,p.kt)("p",null,"AssemblyScript, Rust, JavaScript, TypeScript\ub85c \uc791\uc131\ub41c \uac04\ub2e8\ud55c \uc0d8\ud50c \ucee8\ud2b8\ub799\ud2b8 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc6d0\ud558\ub294 \ud15c\ud50c\ub9bf \uc635\uc158\uc744 \uc120\ud0dd\ud55c \ud6c4 ",(0,p.kt)("inlineCode",{parentName:"p"},"Create Template")," \ubc84\ud2bc\uc744 \ub20c\ub7ec \uc0d8\ud50c \ucee8\ud2b8\ub799\ud2b8 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub354 \ub9ce\uc740 \uc608\uc81c \ucf54\ub4dc \uc18c\uc2a4\ub294 ",(0,p.kt)("a",{parentName:"p",href:"https://github.com/near-examples"},"NEAR Examples"),"\uc5d0\uc11c \ud655\uc778\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("img",{alt:"template-code-near",src:n(79421).Z,title:"template-code-near",width:"318",height:"182"})),(0,p.kt)("h3",{id:"new-project"},"New Project"),(0,p.kt)("p",null,"\uc2a4\ub9c8\ud2b8 \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\uace0\uc790 \ud558\ub294 \uc5b8\uc5b4\uc5d0 \ub530\ub978 \ucee8\ud2b8\ub799\ud2b8 \uad6c\uc870\ub97c \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc6d0\ud558\ub294 \uc5b8\uc5b4 \uc635\uc158\uc744 \uc120\ud0dd\ud558\uace0, \ud504\ub85c\uc81d\ud2b8\uc758 \uc774\ub984\uc744 \uc791\uc131\ud55c \ud6c4 ",(0,p.kt)("inlineCode",{parentName:"p"},"New Project")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uba74 \uc5b8\uc5b4\uc5d0 \uc54c\ub9de\uc740 \ucee8\ud2b8\ub799\ud2b8 \uad6c\uc870\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("img",{alt:"new-project-near",src:n(20409).Z,title:"new-project-near",width:"318",height:"100"})),(0,p.kt)("admonition",{type:"info"},(0,p.kt)("p",{parentName:"admonition"},"WELLDONE Code\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uae30\ub2a5\uc744 \uc774\uc6a9\ud558\uc9c0 \uc54a\uace0\ub3c4 \uc9c1\uc811 \ucee8\ud2b8\ub799\ud2b8 \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8, \ub9ac\ubbf9\uc2a4 \ud50c\ub7ec\uadf8\uc778\uc744 \ud1b5\ud574 \ucef4\ud30c\uc77c \ubc0f \ubc30\ud3ec\ud558\uae30 \uc704\ud574\uc11c\ub294 near/ \ud3f4\ub354 \ub0b4\ubd80\uc5d0 \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. \uc0c8\ub85c \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud55c\ub2e4\uba74 \ud504\ub85c\uc81d\ud2b8\uc758 \uad6c\uc870\ub294 \uc544\ub798\uc640 \uac19\uc544\uc57c \ud569\ub2c8\ub2e4.")),(0,p.kt)("h4",{id:"1-rust\ub85c-\ucee8\ud2b8\ub799\ud2b8\ub97c-\uc791\uc131\ud558\ub294-\uacbd\uc6b0"},"1. Rust\ub85c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0"),(0,p.kt)("pre",null,(0,p.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n")),(0,p.kt)("h4",{id:"2-assemblyscript\ub85c-\ucee8\ud2b8\ub799\ud2b8\ub97c-\uc791\uc131\ud558\ub294-\uacbd\uc6b0"},"2. AssemblyScript\ub85c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0"),(0,p.kt)("pre",null,(0,p.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u2514\u2500\u2500 assembly\n \u251c\u2500\u2500 as_types.d.ts\n \u251c\u2500\u2500 index.ts\n \u2514\u2500\u2500 tsconfig.json\n")),(0,p.kt)("h4",{id:"3-typescript\ub85c-\ucee8\ud2b8\ub799\ud2b8\ub97c-\uc791\uc131\ud558\ub294-\uacbd\uc6b0"},"3. TypeScript\ub85c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0"),(0,p.kt)("pre",null,(0,p.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 package.json\n \u251c\u2500\u2500 babel.config.json\n \u251c\u2500\u2500 tsconfig.json\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.ts\n")),(0,p.kt)("h4",{id:"4-javascript\ub85c-\ucee8\ud2b8\ub799\ud2b8\ub97c-\uc791\uc131\ud558\ub294-\uacbd\uc6b0"},"4. JavaScript\ub85c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0"),(0,p.kt)("pre",null,(0,p.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 package.json\n \u251c\u2500\u2500 babel.config.json\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.js\n")),(0,p.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,p.kt)("admonition",{type:"info"},(0,p.kt)("p",{parentName:"admonition"},"WELLDONE Code\uc5d0\uc11c\ub294 \ud604\uc7ac Rust, CARGO-NEAR, EMBED-ABI, AseemblyScript, JavaScript, TypeScript \ucd1d 6\uac00\uc9c0 \ucef4\ud30c\uc77c \uc635\uc158\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ud604\uc7ac\ub294 AMD \ucef4\ud30c\uc77c \uc11c\ubc84\ub9cc \uc9c0\uc6d0\ud558\uace0 \uc788\uc73c\uba70, \uace7 ARM \ucef4\ud30c\uc77c \uc11c\ubc84\ub3c4 \uc9c0\uc6d0\ud560 \uc608\uc815\uc785\ub2c8\ub2e4.")),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 1"),": ",(0,p.kt)("strong",{parentName:"p"},"PROJECT TO COMPILE")," \uc139\uc158\uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ud504\ub85c\uc81d\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 2"),": \ucef4\ud30c\uc77c \uc635\uc158\uc744 \uc120\ud0dd\ud55c \ud6c4 ",(0,p.kt)("inlineCode",{parentName:"p"},"Compile")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 3"),": \ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub418\uba74 wasm \ud30c\uc77c\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4."),(0,p.kt)("ul",null,(0,p.kt)("li",{parentName:"ul"},(0,p.kt)("strong",{parentName:"li"},"PROJECT TO COMPILE")," \uc139\uc158\uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ud504\ub85c\uc81d\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,p.kt)("li",{parentName:"ul"},"\ucef4\ud30c\uc77c \ubc29\uc2dd\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,p.kt)("li",{parentName:"ul"},(0,p.kt)("strong",{parentName:"li"},"Complie")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4."),(0,p.kt)("li",{parentName:"ul"},"\ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub418\uba74, wasm file\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.")),(0,p.kt)("img",{src:n(15479).Z,alt:"near-compile",style:{width:"318px"}}),(0,p.kt)("admonition",{type:"note"},(0,p.kt)("p",{parentName:"admonition"},"\ubc18\ud658\ub41c wasm \ud30c\uc77c\uc740 ",(0,p.kt)("inlineCode",{parentName:"p"},"near//out")," \ub514\ub809\ud1a0\ub9ac \uc548\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4."),(0,p.kt)("p",{parentName:"admonition"},"\ub2e8, \uc218\uc815 \ud6c4 \ucef4\ud30c\uc77c\uc744 \ub2e4\uc2dc \ud574\uc57c \ud55c\ub2e4\uba74 \ud504\ub85c\uc81d\ud2b8 \ub0b4\uc758 ",(0,p.kt)("inlineCode",{parentName:"p"},"out")," \ub514\ub809\ud1a0\ub9ac\ub97c \uc0ad\uc81c\ud558\uace0 \ub2e4\uc2dc \ucef4\ud30c\uc77c\ud574\uc57c \ud569\ub2c8\ub2e4.")),(0,p.kt)("h3",{id:"1-rust-compile"},"1. Rust Compile"),(0,p.kt)("p",null,(0,p.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/cargo/commands/cargo-build.html"},(0,p.kt)("inlineCode",{parentName:"a"},"cargo build"))," \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub7ec\uc2a4\ud2b8\ub85c \uc791\uc131\ub41c \uc2a4\ub9c8\ud2b8 \ucee8\ud2b8\ub799\ud2b8\ub97c \ucef4\ud30c\uc77c\ud569\ub2c8\ub2e4. \uc548\uc815\uc801\uc778 \ucef4\ud30c\uc77c\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ucee8\ud2b8\ub799\ud2b8 \uc2e4\ud589 \uc2dc \uba54\uc18c\ub4dc\uc758 params\ub97c \uc9c1\uc811 \uc785\ub825\ud574\uc57c \ud558\ub294 \ubd88\ud3b8\ud568\uc774 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("h3",{id:"2-cargo-near-compile-for-rust---experimental"},"2. CARGO-NEAR Compile (for Rust) - ",(0,p.kt)("inlineCode",{parentName:"h3"},"Experimental")),(0,p.kt)("p",null,"NEAR\uc5d0\uc11c \uacf5\uc2dd\uc801\uc73c\ub85c \uac1c\ubc1c \uc911\uc778 ",(0,p.kt)("inlineCode",{parentName:"p"},"cargo near"),"\ub97c \uc774\uc6a9\ud558\uc5ec \ucef4\ud30c\uc77c\ud569\ub2c8\ub2e4. \ucef4\ud30c\uc77c\uc774 \uc131\uacf5\ud558\uba74 \uc2e4\ud589 \uac00\ub2a5\ud55c wasm \ubc14\uc774\ub108\ub9ac \ud30c\uc77c\uacfc \ucee8\ud2b8\ub799\ud2b8\uc758 ABI\uac00 \ub2f4\uae34 json \ud30c\uc77c\uc774 \ud568\uaed8 \uc0dd\uc131\ub429\ub2c8\ub2e4. ",(0,p.kt)("inlineCode",{parentName:"p"},"cargo-near"),"\ub97c \uc0ac\uc6a9\ud574\uc11c \ucef4\ud30c\uc77c\ud55c \ucee8\ud2b8\ub799\ud2b8\ub97c \ubc30\ud3ec\ud558\uc5ec \uac00\uc838\uc628 \uacbd\uc6b0\uc5d0\ub294 \uba54\uc18c\ub4dc\uc758 \ud30c\ub77c\ubbf8\ud130 \ud0c0\uc785\uc744 \uc54c \uc218 \uc788\uc5b4 \ub354\uc6b1 \ud3b8\ud558\uac8c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("p",null,"\ud558\uc9c0\ub9cc \ud574\ub2f9 \uae30\ub2a5\uc740 \uc544\uc9c1 \uac1c\ubc1c \uc911\uc778 \uae30\ub2a5\uc774\uae30 \ub54c\ubb38\uc5d0, ",(0,p.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," \ud30c\uc77c\uc5d0\uc11c ",(0,p.kt)("inlineCode",{parentName:"p"},"near-sdk-rs")," \ubc84\uc804\uc744 ",(0,p.kt)("strong",{parentName:"p"},"4.1.0")," \uc774\uc0c1\uc73c\ub85c \uc9c0\uc815\ud574\uc8fc\uc5b4\uc57c \ud558\uace0 \ucef4\ud30c\uc77c \uacfc\uc815\uc5d0\uc11c \uc608\uc0c1\uce58 \ubabb\ud55c \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud574\ub2f9 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc815\ubcf4\ub294 NEAR\uc758 ",(0,p.kt)("a",{parentName:"p",href:"https://github.com/near/abi"},"\uacf5\uc2dd \ub808\ud3ec\uc9c0\ud1a0\ub9ac"),"\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("h3",{id:"3-embed-abi-compile-for-rust---experimental"},"3. EMBED-ABI Compile (for Rust) - ",(0,p.kt)("inlineCode",{parentName:"h3"},"Experimental")),(0,p.kt)("p",null,(0,p.kt)("inlineCode",{parentName:"p"},"cargo-near"),"\uc758 ",(0,p.kt)("inlineCode",{parentName:"p"},"-embed-abi")," \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uba74 ABI\ub97c \ud3ec\ud568\uc2dc\ud0a8 wasm \ud30c\uc77c\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \ud574\ub2f9 \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucef4\ud30c\uc77c\ud55c wasm \ud30c\uc77c\uc744 \ubc30\ud3ec\ud55c \ucee8\ud2b8\ub799\ud2b8\uc758 \uacbd\uc6b0 ",(0,p.kt)("inlineCode",{parentName:"p"},"At Address")," \ubc84\ud2bc\uc744 \ud1b5\ud574\uc11c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc784\ud3ec\ud2b8\ud560 \ub54c\ub3c4 ABI \uc815\ubcf4\ub97c \uac00\uc838\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc635\uc158\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc124\uba85\uc740 ",(0,p.kt)("a",{parentName:"p",href:"https://github.com/near/cargo-near"},"cargo-near")," \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \ucc38\uace0\ud574\uc8fc\uc138\uc694."),(0,p.kt)("h3",{id:"4-assemblyscript-compile"},"4. AssemblyScript Compile"),(0,p.kt)("p",null,(0,p.kt)("a",{parentName:"p",href:"https://github.com/AssemblyScript/asbuild"},(0,p.kt)("inlineCode",{parentName:"a"},"asbuild")),"\ub97c \uc0ac\uc6a9\ud558\uc5ec AssemblyScript\ub85c \uc791\uc131\ub41c \ucee8\ud2b8\ub799\ud2b8\ub97c \ucef4\ud30c\uc77c\ud569\ub2c8\ub2e4. \uc548\uc815\uc801\uc778 \ucef4\ud30c\uc77c\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4."),(0,p.kt)("h3",{id:"5-javascript--typescript-compile"},"5. JavaScript & TypeScript Compile"),(0,p.kt)("p",null,(0,p.kt)("a",{parentName:"p",href:"https://github.com/near/near-sdk-js"},(0,p.kt)("inlineCode",{parentName:"a"},"near-sdk-js")),"\ub97c \uc0ac\uc6a9\ud558\uc5ec JavaScript \ud639\uc740 TypeScript\ub85c \uc791\uc131\ub41c \ucee8\ud2b8\ub799\ud2b8\ub97c \ucef4\ud30c\uc77c\ud569\ub2c8\ub2e4."),(0,p.kt)("admonition",{type:"note"},(0,p.kt)("p",{parentName:"admonition"},"JavaScript \ud639\uc740 TypeScript \ucef4\ud30c\uc77c \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0, \ubc18\ub4dc\uc2dc \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ucee8\ud2b8\ub799\ud2b8 \ud30c\uc77c\uc758 \uc774\ub984\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc9c0\uc815\ud574\uc8fc\uc5b4\uc57c \uc815\uc0c1\uc801\uc73c\ub85c \ucef4\ud30c\uc77c\uc774 \uc2e4\ud589\ub429\ub2c8\ub2e4."),(0,p.kt)("ul",{parentName:"admonition"},(0,p.kt)("li",{parentName:"ul"},"JavaScript: ",(0,p.kt)("inlineCode",{parentName:"li"},"contract.js")),(0,p.kt)("li",{parentName:"ul"},"TypeScript: ",(0,p.kt)("inlineCode",{parentName:"li"},"contract.ts")," "))),(0,p.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,p.kt)("admonition",{type:"tip"},(0,p.kt)("p",{parentName:"admonition"},"WELLDONE Wallet\uc5d0\uc11c\ub294 \ud574\ub2f9 \uc9c0\uac11 \uc8fc\uc18c\uc5d0 \uc5f0\uacb0\ub41c \ub124\ud2b8\uc6cc\ud06c\ub97c \uc790\ub3d9\uc73c\ub85c \uac10\uc9c0\ud558\uc5ec \uac00\uc838\uc635\ub2c8\ub2e4. \ub530\ub77c\uc11c Deploy\ub97c \ud558\uae30 \uc774\uc804\uc5d0 \uba54\uc778\ub137\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\ub0bc \uac83\uc778\uc9c0, \ud14c\uc2a4\ud2b8\ub137\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\ub0bc \uac83\uc778\uc9c0 \ubbf8\ub9ac \uace0\ub824\ud574\ub450\uc5b4\uc57c \ud569\ub2c8\ub2e4.")),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 1"),": \ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub41c \ucee8\ud2b8\ub799\ud2b8 \ucf54\ub4dc\uac00 \uc788\ub294 \uacbd\uc6b0 ",(0,p.kt)("inlineCode",{parentName:"p"},"Deploy")," \ubc84\ud2bc\uc774 \ud65c\uc131\ud654\ub429\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 2"),": ",(0,p.kt)("inlineCode",{parentName:"p"},"receive_id"),"\uc5d0 \ucee8\ud2b8\ub799\ud2b8\ub97c \ubc30\ud3ec\ud560 \uacc4\uc815\uc758 ID\ub97c \uc785\ub825\ud558\uace0 ",(0,p.kt)("inlineCode",{parentName:"p"},"Deploy")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. ",(0,p.kt)("inlineCode",{parentName:"p"},"init function"),"\uc744 \ucd94\uac00\ud558\uace0 \uc2f6\ub2e4\uba74 ",(0,p.kt)("inlineCode",{parentName:"p"},"Deploy Option")," \uc744 \ud074\ub9ad\ud558\uc5ec \uba54\uc18c\ub4dc \uc774\ub984\uacfc \uc778\uc790\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4."),(0,p.kt)("img",{src:n(89281).Z,alt:"deploy-option-near",style:{width:"318px"}}),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 3"),": \ub9cc\uc57d \ud574\ub2f9 \uacc4\uc815\uc5d0 \uc774\ubbf8 \ubc30\ud3ec\ub41c \ucee8\ud2b8\ub799\ud2b8\uac00 \uc788\ub2e4\uba74 \ud55c \ubc88 \ub354 \uc0ac\uc6a9\uc790\uc758 \ud655\uc778\uc744 \uc694\uccad\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 4"),": ",(0,p.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," \ucc3d\uc5d0\uc11c ",(0,p.kt)("inlineCode",{parentName:"p"},"Send Tx")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158\uc5d0 \uc11c\uba85\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("img",{alt:"Deploy",src:n(59263).Z,title:"Deploy",width:"713",height:"870"})),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 5"),": \ucee8\ud2b8\ub799\ud2b8 \ubc30\ud3ec\uac00 \uc131\uacf5\ud558\uba74 \ud130\ubbf8\ub110\uc5d0 \ud2b8\ub79c\uc7ad\uc158 \uc131\uacf5 \ub85c\uadf8\uac00 \ucd9c\ub825\ub418\uace0, \ucee8\ud2b8\ub799\ud2b8\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("img",{src:n(12549).Z,alt:"deployed-contract-near",style:{width:"318px"}}),(0,p.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,p.kt)("admonition",{type:"info"},(0,p.kt)("p",{parentName:"admonition"},"\ucee8\ud2b8\ub799\ud2b8\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95\uc5d0\ub294 \ub450 \uac00\uc9c0\uac00 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("ol",{parentName:"admonition"},(0,p.kt)("li",{parentName:"ol"},"\uc704\uc758 \uacfc\uc815\uc744 \ud1b5\ud574 \ubc30\ud3ec\ud55c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc790\ub3d9\uc73c\ub85c \uac00\uc838\uc624\ub294 \ubc29\ubc95"),(0,p.kt)("li",{parentName:"ol"},(0,p.kt)("inlineCode",{parentName:"li"},"At address")," \ubc84\ud2bc\uc744 \ud1b5\ud574 \uae30\uc874\uc5d0 \ubc30\ud3ec\ub41c \ucee8\ud2b8\ub799\ud2b8\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95"))),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 1"),": \uc2e4\ud589\ud560 \uba54\uc18c\ub4dc\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 2"),": \ud544\uc694\uc5d0 \ub530\ub77c \ub9e4\uac1c\ubcc0\uc218\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 3"),": ",(0,p.kt)("inlineCode",{parentName:"p"},"Call")," \ud568\uc218\uc77c \uacbd\uc6b0, \ud568\uc218 \ud638\ucd9c\uacfc \ud568\uaed8 \ubcf4\ub0bc NEAR \ud1a0\ud070 \uc591\uacfc GAS LIMIT\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 4"),": ",(0,p.kt)("inlineCode",{parentName:"p"},"View")," \ub610\ub294 ",(0,p.kt)("inlineCode",{parentName:"p"},"Call")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \uba54\uc18c\ub4dc\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\ub79c\uc7ad\uc158\uc744 \uc804\uc1a1\ud558\ub294 \uacbd\uc6b0, ",(0,p.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"\uc5d0\uc11c ",(0,p.kt)("inlineCode",{parentName:"p"},"Send Tx")," \ubc84\ud2bc\uc744 \ub20c\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc5d0 \uc11c\uba85\ud574\uc57c \ud569\ub2c8\ub2e4."),(0,p.kt)("img",{src:n(45580).Z,alt:"function-call",style:{width:"318px"}}),(0,p.kt)("admonition",{type:"info"},(0,p.kt)("p",{parentName:"admonition"},(0,p.kt)("inlineCode",{parentName:"p"},"CARGO-NEAR")," \ud639\uc740 ",(0,p.kt)("inlineCode",{parentName:"p"},"EMBED-ABI")," \uc635\uc158\uc744 \uc120\ud0dd\ud558\uc5ec \ucef4\ud30c\uc77c\ud55c \ucee8\ud2b8\ub799\ud2b8\ub97c \ubc30\ud3ec\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc2e4\ud589\ud560 \uba54\uc18c\ub4dc\uc758 \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c1\uc811 \uc785\ub825\ud558\uc9c0 \uc54a\uace0 ABI\uc758 \uc815\ubcf4\ub97c \uc774\uc6a9\ud574\uc11c \ub354\uc6b1 \uac04\ub2e8\ud558\uac8c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.")),(0,p.kt)("img",{src:n(56143).Z,alt:"cargo-near",style:{width:"318px"}}),(0,p.kt)("img",{src:n(48532).Z,alt:"cargo-near1",style:{width:"318px"}}),(0,p.kt)("img",{src:n(85635).Z,alt:"cargo-near2",style:{width:"318px"}}))}d.isMDXComponent=!0},56143:function(e,t,n){t.Z=n.p+"assets/images/cargo-near-c568fd71c61f12a85da6cc7d0dfa1287.png"},48532:function(e,t,n){t.Z=n.p+"assets/images/cargo-near1-63a86879b1ab80e22f7ffaeef8b8e0af.png"},85635:function(e,t){t.Z="data:image/png;base64,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"},89281:function(e,t,n){t.Z=n.p+"assets/images/deploy-option-near-fdbe115f2a885fcaf1f1f6ad4eb2995c.png"},12549:function(e,t,n){t.Z=n.p+"assets/images/deployed-contract-near-7efeed4abf28f4791c3f9d54dac7083e.png"},45580:function(e,t,n){t.Z=n.p+"assets/images/function-call-847ffb3dc6c1386cd8c482602eb68864.png"},15479:function(e,t,n){t.Z=n.p+"assets/images/project-compile-8d1e5eaf8fb296055fc02c6f0cb4825c.png"},59263:function(e,t,n){t.Z=n.p+"assets/images/deploy-near-5064c578366ef3cbf0eb88a7d241e2f7.png"},20409:function(e,t,n){t.Z=n.p+"assets/images/new-project-near-66c80e06b15f523ccd5a53569fbefb89.png"},79421:function(e,t,n){t.Z=n.p+"assets/images/template-code-near-9cb4d704a5d9a66a5b8058a4f7aa8e54.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/3cd63f6d.1710c5d0.js b/ko/assets/js/3cd63f6d.1710c5d0.js new file mode 100644 index 000000000..2d2b782d7 --- /dev/null +++ b/ko/assets/js/3cd63f6d.1710c5d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[1362],{3905:function(e,t,n){n.d(t,{Zo:function(){return s},kt:function(){return A}});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},s=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,p=e.originalType,l=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=c(n),A=r,u=d["".concat(l,".").concat(A)]||d[A]||m[A]||p;return n?a.createElement(u,o(o({ref:t},s),{},{components:n})):a.createElement(u,o({ref:t},s))}));function A(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var p=n.length,o=new Array(p);o[0]=d;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:r,o[1]=i;for(var c=2;cExperimental",id:"2-cargo-near-compile-for-rust---experimental",level:3},{value:"3. EMBED-ABI Compile (for Rust) - Experimental",id:"3-embed-abi-compile-for-rust---experimental",level:3},{value:"4. AssemblyScript Compile",id:"4-assemblyscript-compile",level:3},{value:"5. JavaScript & TypeScript Compile",id:"5-javascript--typescript-compile",level:3},{value:"Deploy the Contract",id:"deploy-the-contract",level:2},{value:"Execute the Contract",id:"execute-the-contract",level:2}],d={toc:m};function A(e){var t=e.components,i=(0,r.Z)(e,o);return(0,p.kt)("wrapper",(0,a.Z)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,p.kt)("h1",{id:"near"},"NEAR"),(0,p.kt)("h3",{id:"welldone-code\ub85c-\uc811\uc18d"},"WELLDONE Code\ub85c \uc811\uc18d"),(0,p.kt)("p",null,(0,p.kt)("a",{parentName:"p",href:"https://remix.ethereum.org/?#activate=wds-code-remix"},"WELLDONE Code \ud50c\ub7ec\uadf8\uc778")," \ub525 \ub9c1\ud06c\ub97c \ud1b5\ud574 \uc811\uc18d\ud558\uba74 ",(0,p.kt)("strong",{parentName:"p"},"WELLDONE Code")," \ud50c\ub7ec\uadf8\uc778\uc744 \ud65c\uc131\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("h2",{id:"create-the-project"},"Create the Project"),(0,p.kt)("p",null,"NEAR\ub294 AssemblyScript, Rust, JavaScript, TypeScript\ub85c \uc2a4\ub9c8\ud2b8 \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac01 \uc5b8\uc5b4 \ubcc4\ub85c \ucee8\ud2b8\ub799\ud2b8\uc758 \uad6c\uc870\uac00 \ub2e4\ub974\uae30 \ub54c\ubb38\uc5d0 WELLDONE Code\ub294 NEAR\uc5d0 \uc785\ubb38\ud558\ub294 \uac1c\ubc1c\uc790\ub4e4\uc744 \ub3c4\uc640\uc8fc\uae30 \uc704\ud574 \ub450 \uac00\uc9c0 \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4."),(0,p.kt)("h3",{id:"create-template"},"Create Template"),(0,p.kt)("p",null,"AssemblyScript, Rust, JavaScript, TypeScript\ub85c \uc791\uc131\ub41c \uac04\ub2e8\ud55c \uc0d8\ud50c \ucee8\ud2b8\ub799\ud2b8 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc6d0\ud558\ub294 \ud15c\ud50c\ub9bf \uc635\uc158\uc744 \uc120\ud0dd\ud55c \ud6c4 ",(0,p.kt)("inlineCode",{parentName:"p"},"Create Template")," \ubc84\ud2bc\uc744 \ub20c\ub7ec \uc0d8\ud50c \ucee8\ud2b8\ub799\ud2b8 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub354 \ub9ce\uc740 \uc608\uc81c \ucf54\ub4dc \uc18c\uc2a4\ub294 ",(0,p.kt)("a",{parentName:"p",href:"https://github.com/near-examples"},"NEAR Examples"),"\uc5d0\uc11c \ud655\uc778\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("img",{alt:"template-code-near",src:n(79421).Z,title:"template-code-near",width:"318",height:"182"})),(0,p.kt)("h3",{id:"new-project"},"New Project"),(0,p.kt)("p",null,"\uc2a4\ub9c8\ud2b8 \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\uace0\uc790 \ud558\ub294 \uc5b8\uc5b4\uc5d0 \ub530\ub978 \ucee8\ud2b8\ub799\ud2b8 \uad6c\uc870\ub97c \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc6d0\ud558\ub294 \uc5b8\uc5b4 \uc635\uc158\uc744 \uc120\ud0dd\ud558\uace0, \ud504\ub85c\uc81d\ud2b8\uc758 \uc774\ub984\uc744 \uc791\uc131\ud55c \ud6c4 ",(0,p.kt)("inlineCode",{parentName:"p"},"New Project")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uba74 \uc5b8\uc5b4\uc5d0 \uc54c\ub9de\uc740 \ucee8\ud2b8\ub799\ud2b8 \uad6c\uc870\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("img",{alt:"new-project-near",src:n(20409).Z,title:"new-project-near",width:"318",height:"100"})),(0,p.kt)("admonition",{type:"info"},(0,p.kt)("p",{parentName:"admonition"},"WELLDONE Code\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uae30\ub2a5\uc744 \uc774\uc6a9\ud558\uc9c0 \uc54a\uace0\ub3c4 \uc9c1\uc811 \ucee8\ud2b8\ub799\ud2b8 \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8, \ub9ac\ubbf9\uc2a4 \ud50c\ub7ec\uadf8\uc778\uc744 \ud1b5\ud574 \ucef4\ud30c\uc77c \ubc0f \ubc30\ud3ec\ud558\uae30 \uc704\ud574\uc11c\ub294 near/ \ud3f4\ub354 \ub0b4\ubd80\uc5d0 \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. \uc0c8\ub85c \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud55c\ub2e4\uba74 \ud504\ub85c\uc81d\ud2b8\uc758 \uad6c\uc870\ub294 \uc544\ub798\uc640 \uac19\uc544\uc57c \ud569\ub2c8\ub2e4.")),(0,p.kt)("h4",{id:"1-rust\ub85c-\ucee8\ud2b8\ub799\ud2b8\ub97c-\uc791\uc131\ud558\ub294-\uacbd\uc6b0"},"1. Rust\ub85c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0"),(0,p.kt)("pre",null,(0,p.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n")),(0,p.kt)("h4",{id:"2-assemblyscript\ub85c-\ucee8\ud2b8\ub799\ud2b8\ub97c-\uc791\uc131\ud558\ub294-\uacbd\uc6b0"},"2. AssemblyScript\ub85c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0"),(0,p.kt)("pre",null,(0,p.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u2514\u2500\u2500 assembly\n \u251c\u2500\u2500 as_types.d.ts\n \u251c\u2500\u2500 index.ts\n \u2514\u2500\u2500 tsconfig.json\n")),(0,p.kt)("h4",{id:"3-typescript\ub85c-\ucee8\ud2b8\ub799\ud2b8\ub97c-\uc791\uc131\ud558\ub294-\uacbd\uc6b0"},"3. TypeScript\ub85c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0"),(0,p.kt)("pre",null,(0,p.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 package.json\n \u251c\u2500\u2500 babel.config.json\n \u251c\u2500\u2500 tsconfig.json\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.ts\n")),(0,p.kt)("h4",{id:"4-javascript\ub85c-\ucee8\ud2b8\ub799\ud2b8\ub97c-\uc791\uc131\ud558\ub294-\uacbd\uc6b0"},"4. JavaScript\ub85c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc791\uc131\ud558\ub294 \uacbd\uc6b0"),(0,p.kt)("pre",null,(0,p.kt)("code",{parentName:"pre"},"near\n\u2514\u2500\u2500 \n \u251c\u2500\u2500 package.json\n \u251c\u2500\u2500 babel.config.json\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.js\n")),(0,p.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,p.kt)("admonition",{type:"info"},(0,p.kt)("p",{parentName:"admonition"},"WELLDONE Code\uc5d0\uc11c\ub294 \ud604\uc7ac Rust, CARGO-NEAR, EMBED-ABI, AseemblyScript, JavaScript, TypeScript \ucd1d 6\uac00\uc9c0 \ucef4\ud30c\uc77c \uc635\uc158\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ud604\uc7ac\ub294 AMD \ucef4\ud30c\uc77c \uc11c\ubc84\ub9cc \uc9c0\uc6d0\ud558\uace0 \uc788\uc73c\uba70, \uace7 ARM \ucef4\ud30c\uc77c \uc11c\ubc84\ub3c4 \uc9c0\uc6d0\ud560 \uc608\uc815\uc785\ub2c8\ub2e4.")),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 1"),": ",(0,p.kt)("strong",{parentName:"p"},"PROJECT TO COMPILE")," \uc139\uc158\uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ud504\ub85c\uc81d\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 2"),": \ucef4\ud30c\uc77c \uc635\uc158\uc744 \uc120\ud0dd\ud55c \ud6c4 ",(0,p.kt)("inlineCode",{parentName:"p"},"Compile")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 3"),": \ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub418\uba74 wasm \ud30c\uc77c\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4."),(0,p.kt)("ul",null,(0,p.kt)("li",{parentName:"ul"},(0,p.kt)("strong",{parentName:"li"},"PROJECT TO COMPILE")," \uc139\uc158\uc5d0\uc11c \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ud504\ub85c\uc81d\ud2b8\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,p.kt)("li",{parentName:"ul"},"\ucef4\ud30c\uc77c \ubc29\uc2dd\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,p.kt)("li",{parentName:"ul"},(0,p.kt)("strong",{parentName:"li"},"Complie")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4."),(0,p.kt)("li",{parentName:"ul"},"\ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub418\uba74, wasm file\uc774 \ubc18\ud658\ub429\ub2c8\ub2e4.")),(0,p.kt)("img",{src:n(15479).Z,alt:"near-compile",style:{width:"318px"}}),(0,p.kt)("admonition",{type:"note"},(0,p.kt)("p",{parentName:"admonition"},"\ubc18\ud658\ub41c wasm \ud30c\uc77c\uc740 ",(0,p.kt)("inlineCode",{parentName:"p"},"near//out")," \ub514\ub809\ud1a0\ub9ac \uc548\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4."),(0,p.kt)("p",{parentName:"admonition"},"\ub2e8, \uc218\uc815 \ud6c4 \ucef4\ud30c\uc77c\uc744 \ub2e4\uc2dc \ud574\uc57c \ud55c\ub2e4\uba74 \ud504\ub85c\uc81d\ud2b8 \ub0b4\uc758 ",(0,p.kt)("inlineCode",{parentName:"p"},"out")," \ub514\ub809\ud1a0\ub9ac\ub97c \uc0ad\uc81c\ud558\uace0 \ub2e4\uc2dc \ucef4\ud30c\uc77c\ud574\uc57c \ud569\ub2c8\ub2e4.")),(0,p.kt)("h3",{id:"1-rust-compile"},"1. Rust Compile"),(0,p.kt)("p",null,(0,p.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/cargo/commands/cargo-build.html"},(0,p.kt)("inlineCode",{parentName:"a"},"cargo build"))," \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub7ec\uc2a4\ud2b8\ub85c \uc791\uc131\ub41c \uc2a4\ub9c8\ud2b8 \ucee8\ud2b8\ub799\ud2b8\ub97c \ucef4\ud30c\uc77c\ud569\ub2c8\ub2e4. \uc548\uc815\uc801\uc778 \ucef4\ud30c\uc77c\uc744 \uc81c\uacf5\ud558\uc9c0\ub9cc, \ucee8\ud2b8\ub799\ud2b8 \uc2e4\ud589 \uc2dc \uba54\uc18c\ub4dc\uc758 params\ub97c \uc9c1\uc811 \uc785\ub825\ud574\uc57c \ud558\ub294 \ubd88\ud3b8\ud568\uc774 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("h3",{id:"2-cargo-near-compile-for-rust---experimental"},"2. CARGO-NEAR Compile (for Rust) - ",(0,p.kt)("inlineCode",{parentName:"h3"},"Experimental")),(0,p.kt)("p",null,"NEAR\uc5d0\uc11c \uacf5\uc2dd\uc801\uc73c\ub85c \uac1c\ubc1c \uc911\uc778 ",(0,p.kt)("inlineCode",{parentName:"p"},"cargo near"),"\ub97c \uc774\uc6a9\ud558\uc5ec \ucef4\ud30c\uc77c\ud569\ub2c8\ub2e4. \ucef4\ud30c\uc77c\uc774 \uc131\uacf5\ud558\uba74 \uc2e4\ud589 \uac00\ub2a5\ud55c wasm \ubc14\uc774\ub108\ub9ac \ud30c\uc77c\uacfc \ucee8\ud2b8\ub799\ud2b8\uc758 ABI\uac00 \ub2f4\uae34 json \ud30c\uc77c\uc774 \ud568\uaed8 \uc0dd\uc131\ub429\ub2c8\ub2e4. ",(0,p.kt)("inlineCode",{parentName:"p"},"cargo-near"),"\ub97c \uc0ac\uc6a9\ud574\uc11c \ucef4\ud30c\uc77c\ud55c \ucee8\ud2b8\ub799\ud2b8\ub97c \ubc30\ud3ec\ud558\uc5ec \uac00\uc838\uc628 \uacbd\uc6b0\uc5d0\ub294 \uba54\uc18c\ub4dc\uc758 \ud30c\ub77c\ubbf8\ud130 \ud0c0\uc785\uc744 \uc54c \uc218 \uc788\uc5b4 \ub354\uc6b1 \ud3b8\ud558\uac8c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("p",null,"\ud558\uc9c0\ub9cc \ud574\ub2f9 \uae30\ub2a5\uc740 \uc544\uc9c1 \uac1c\ubc1c \uc911\uc778 \uae30\ub2a5\uc774\uae30 \ub54c\ubb38\uc5d0, ",(0,p.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," \ud30c\uc77c\uc5d0\uc11c ",(0,p.kt)("inlineCode",{parentName:"p"},"near-sdk-rs")," \ubc84\uc804\uc744 ",(0,p.kt)("strong",{parentName:"p"},"4.1.0")," \uc774\uc0c1\uc73c\ub85c \uc9c0\uc815\ud574\uc8fc\uc5b4\uc57c \ud558\uace0 \ucef4\ud30c\uc77c \uacfc\uc815\uc5d0\uc11c \uc608\uc0c1\uce58 \ubabb\ud55c \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud574\ub2f9 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc815\ubcf4\ub294 NEAR\uc758 ",(0,p.kt)("a",{parentName:"p",href:"https://github.com/near/abi"},"\uacf5\uc2dd \ub808\ud3ec\uc9c0\ud1a0\ub9ac"),"\uc5d0\uc11c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("h3",{id:"3-embed-abi-compile-for-rust---experimental"},"3. EMBED-ABI Compile (for Rust) - ",(0,p.kt)("inlineCode",{parentName:"h3"},"Experimental")),(0,p.kt)("p",null,(0,p.kt)("inlineCode",{parentName:"p"},"cargo-near"),"\uc758 ",(0,p.kt)("inlineCode",{parentName:"p"},"-embed-abi")," \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uba74 ABI\ub97c \ud3ec\ud568\uc2dc\ud0a8 wasm \ud30c\uc77c\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \ud574\ub2f9 \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \ucef4\ud30c\uc77c\ud55c wasm \ud30c\uc77c\uc744 \ubc30\ud3ec\ud55c \ucee8\ud2b8\ub799\ud2b8\uc758 \uacbd\uc6b0 ",(0,p.kt)("inlineCode",{parentName:"p"},"At Address")," \ubc84\ud2bc\uc744 \ud1b5\ud574\uc11c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc784\ud3ec\ud2b8\ud560 \ub54c\ub3c4 ABI \uc815\ubcf4\ub97c \uac00\uc838\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc635\uc158\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc124\uba85\uc740 ",(0,p.kt)("a",{parentName:"p",href:"https://github.com/near/cargo-near"},"cargo-near")," \ub808\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \ucc38\uace0\ud574\uc8fc\uc138\uc694."),(0,p.kt)("h3",{id:"4-assemblyscript-compile"},"4. AssemblyScript Compile"),(0,p.kt)("p",null,(0,p.kt)("a",{parentName:"p",href:"https://github.com/AssemblyScript/asbuild"},(0,p.kt)("inlineCode",{parentName:"a"},"asbuild")),"\ub97c \uc0ac\uc6a9\ud558\uc5ec AssemblyScript\ub85c \uc791\uc131\ub41c \ucee8\ud2b8\ub799\ud2b8\ub97c \ucef4\ud30c\uc77c\ud569\ub2c8\ub2e4. \uc548\uc815\uc801\uc778 \ucef4\ud30c\uc77c\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4."),(0,p.kt)("h3",{id:"5-javascript--typescript-compile"},"5. JavaScript & TypeScript Compile"),(0,p.kt)("p",null,(0,p.kt)("a",{parentName:"p",href:"https://github.com/near/near-sdk-js"},(0,p.kt)("inlineCode",{parentName:"a"},"near-sdk-js")),"\ub97c \uc0ac\uc6a9\ud558\uc5ec JavaScript \ud639\uc740 TypeScript\ub85c \uc791\uc131\ub41c \ucee8\ud2b8\ub799\ud2b8\ub97c \ucef4\ud30c\uc77c\ud569\ub2c8\ub2e4."),(0,p.kt)("admonition",{type:"note"},(0,p.kt)("p",{parentName:"admonition"},"JavaScript \ud639\uc740 TypeScript \ucef4\ud30c\uc77c \uc635\uc158\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0, \ubc18\ub4dc\uc2dc \ucef4\ud30c\uc77c\ud558\uace0\uc790 \ud558\ub294 \ucee8\ud2b8\ub799\ud2b8 \ud30c\uc77c\uc758 \uc774\ub984\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc9c0\uc815\ud574\uc8fc\uc5b4\uc57c \uc815\uc0c1\uc801\uc73c\ub85c \ucef4\ud30c\uc77c\uc774 \uc2e4\ud589\ub429\ub2c8\ub2e4."),(0,p.kt)("ul",{parentName:"admonition"},(0,p.kt)("li",{parentName:"ul"},"JavaScript: ",(0,p.kt)("inlineCode",{parentName:"li"},"contract.js")),(0,p.kt)("li",{parentName:"ul"},"TypeScript: ",(0,p.kt)("inlineCode",{parentName:"li"},"contract.ts")," "))),(0,p.kt)("h2",{id:"deploy-the-contract"},"Deploy the Contract"),(0,p.kt)("admonition",{type:"tip"},(0,p.kt)("p",{parentName:"admonition"},"WELLDONE Wallet\uc5d0\uc11c\ub294 \ud574\ub2f9 \uc9c0\uac11 \uc8fc\uc18c\uc5d0 \uc5f0\uacb0\ub41c \ub124\ud2b8\uc6cc\ud06c\ub97c \uc790\ub3d9\uc73c\ub85c \uac10\uc9c0\ud558\uc5ec \uac00\uc838\uc635\ub2c8\ub2e4. \ub530\ub77c\uc11c Deploy\ub97c \ud558\uae30 \uc774\uc804\uc5d0 \uba54\uc778\ub137\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\ub0bc \uac83\uc778\uc9c0, \ud14c\uc2a4\ud2b8\ub137\uc5d0 \ud2b8\ub79c\uc7ad\uc158\uc744 \ubcf4\ub0bc \uac83\uc778\uc9c0 \ubbf8\ub9ac \uace0\ub824\ud574\ub450\uc5b4\uc57c \ud569\ub2c8\ub2e4.")),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 1"),": \ucef4\ud30c\uc77c\uc774 \uc644\ub8cc\ub41c \ucee8\ud2b8\ub799\ud2b8 \ucf54\ub4dc\uac00 \uc788\ub294 \uacbd\uc6b0 ",(0,p.kt)("inlineCode",{parentName:"p"},"Deploy")," \ubc84\ud2bc\uc774 \ud65c\uc131\ud654\ub429\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 2"),": ",(0,p.kt)("inlineCode",{parentName:"p"},"receive_id"),"\uc5d0 \ucee8\ud2b8\ub799\ud2b8\ub97c \ubc30\ud3ec\ud560 \uacc4\uc815\uc758 ID\ub97c \uc785\ub825\ud558\uace0 ",(0,p.kt)("inlineCode",{parentName:"p"},"Deploy")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. ",(0,p.kt)("inlineCode",{parentName:"p"},"init function"),"\uc744 \ucd94\uac00\ud558\uace0 \uc2f6\ub2e4\uba74 ",(0,p.kt)("inlineCode",{parentName:"p"},"Deploy Option")," \uc744 \ud074\ub9ad\ud558\uc5ec \uba54\uc18c\ub4dc \uc774\ub984\uacfc \uc778\uc790\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4."),(0,p.kt)("img",{src:n(89281).Z,alt:"deploy-option-near",style:{width:"318px"}}),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 3"),": \ub9cc\uc57d \ud574\ub2f9 \uacc4\uc815\uc5d0 \uc774\ubbf8 \ubc30\ud3ec\ub41c \ucee8\ud2b8\ub799\ud2b8\uac00 \uc788\ub2e4\uba74 \ud55c \ubc88 \ub354 \uc0ac\uc6a9\uc790\uc758 \ud655\uc778\uc744 \uc694\uccad\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 4"),": ",(0,p.kt)("strong",{parentName:"p"},"WELLDONE Wallet")," \ucc3d\uc5d0\uc11c ",(0,p.kt)("inlineCode",{parentName:"p"},"Send Tx")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \ud2b8\ub79c\uc7ad\uc158\uc5d0 \uc11c\uba85\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("img",{alt:"Deploy",src:n(59263).Z,title:"Deploy",width:"713",height:"870"})),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 5"),": \ucee8\ud2b8\ub799\ud2b8 \ubc30\ud3ec\uac00 \uc131\uacf5\ud558\uba74 \ud130\ubbf8\ub110\uc5d0 \ud2b8\ub79c\uc7ad\uc158 \uc131\uacf5 \ub85c\uadf8\uac00 \ucd9c\ub825\ub418\uace0, \ucee8\ud2b8\ub799\ud2b8\ub97c \uc2e4\ud589\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("img",{src:n(12549).Z,alt:"deployed-contract-near",style:{width:"318px"}}),(0,p.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,p.kt)("admonition",{type:"info"},(0,p.kt)("p",{parentName:"admonition"},"\ucee8\ud2b8\ub799\ud2b8\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95\uc5d0\ub294 \ub450 \uac00\uc9c0\uac00 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("ol",{parentName:"admonition"},(0,p.kt)("li",{parentName:"ol"},"\uc704\uc758 \uacfc\uc815\uc744 \ud1b5\ud574 \ubc30\ud3ec\ud55c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc790\ub3d9\uc73c\ub85c \uac00\uc838\uc624\ub294 \ubc29\ubc95"),(0,p.kt)("li",{parentName:"ol"},(0,p.kt)("inlineCode",{parentName:"li"},"At address")," \ubc84\ud2bc\uc744 \ud1b5\ud574 \uae30\uc874\uc5d0 \ubc30\ud3ec\ub41c \ucee8\ud2b8\ub799\ud2b8\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95"))),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 1"),": \uc2e4\ud589\ud560 \uba54\uc18c\ub4dc\ub97c \uc120\ud0dd\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 2"),": \ud544\uc694\uc5d0 \ub530\ub77c \ub9e4\uac1c\ubcc0\uc218\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 3"),": ",(0,p.kt)("inlineCode",{parentName:"p"},"Call")," \ud568\uc218\uc77c \uacbd\uc6b0, \ud568\uc218 \ud638\ucd9c\uacfc \ud568\uaed8 \ubcf4\ub0bc NEAR \ud1a0\ud070 \uc591\uacfc GAS LIMIT\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."),(0,p.kt)("p",null,(0,p.kt)("strong",{parentName:"p"},"Step 4"),": ",(0,p.kt)("inlineCode",{parentName:"p"},"View")," \ub610\ub294 ",(0,p.kt)("inlineCode",{parentName:"p"},"Call")," \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\uc5ec \uba54\uc18c\ub4dc\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4. \ud2b8\ub79c\uc7ad\uc158\uc744 \uc804\uc1a1\ud558\ub294 \uacbd\uc6b0, ",(0,p.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"\uc5d0\uc11c ",(0,p.kt)("inlineCode",{parentName:"p"},"Send Tx")," \ubc84\ud2bc\uc744 \ub20c\ub7ec \ud2b8\ub79c\uc7ad\uc158\uc5d0 \uc11c\uba85\ud574\uc57c \ud569\ub2c8\ub2e4."),(0,p.kt)("img",{src:n(45580).Z,alt:"function-call",style:{width:"318px"}}),(0,p.kt)("admonition",{type:"info"},(0,p.kt)("p",{parentName:"admonition"},(0,p.kt)("inlineCode",{parentName:"p"},"CARGO-NEAR")," \ud639\uc740 ",(0,p.kt)("inlineCode",{parentName:"p"},"EMBED-ABI")," \uc635\uc158\uc744 \uc120\ud0dd\ud558\uc5ec \ucef4\ud30c\uc77c\ud55c \ucee8\ud2b8\ub799\ud2b8\ub97c \ubc30\ud3ec\ud55c \uacbd\uc6b0\uc5d0\ub294 \uc2e4\ud589\ud560 \uba54\uc18c\ub4dc\uc758 \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c1\uc811 \uc785\ub825\ud558\uc9c0 \uc54a\uace0 ABI\uc758 \uc815\ubcf4\ub97c \uc774\uc6a9\ud574\uc11c \ub354\uc6b1 \uac04\ub2e8\ud558\uac8c \ucee8\ud2b8\ub799\ud2b8\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.")),(0,p.kt)("img",{src:n(56143).Z,alt:"cargo-near",style:{width:"318px"}}),(0,p.kt)("img",{src:n(48532).Z,alt:"cargo-near1",style:{width:"318px"}}),(0,p.kt)("img",{src:n(85635).Z,alt:"cargo-near2",style:{width:"318px"}}))}A.isMDXComponent=!0},56143:function(e,t,n){t.Z=n.p+"assets/images/cargo-near-c568fd71c61f12a85da6cc7d0dfa1287.png"},48532:function(e,t,n){t.Z=n.p+"assets/images/cargo-near1-63a86879b1ab80e22f7ffaeef8b8e0af.png"},85635:function(e,t){t.Z="data:image/png;base64,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"},89281:function(e,t,n){t.Z=n.p+"assets/images/deploy-option-near-fdbe115f2a885fcaf1f1f6ad4eb2995c.png"},12549:function(e,t,n){t.Z=n.p+"assets/images/deployed-contract-near-7efeed4abf28f4791c3f9d54dac7083e.png"},45580:function(e,t,n){t.Z=n.p+"assets/images/function-call-847ffb3dc6c1386cd8c482602eb68864.png"},15479:function(e,t,n){t.Z=n.p+"assets/images/project-compile-8d1e5eaf8fb296055fc02c6f0cb4825c.png"},59263:function(e,t,n){t.Z=n.p+"assets/images/deploy-near-5064c578366ef3cbf0eb88a7d241e2f7.png"},20409:function(e,t,n){t.Z=n.p+"assets/images/new-project-near-66c80e06b15f523ccd5a53569fbefb89.png"},79421:function(e,t,n){t.Z=n.p+"assets/images/template-code-near-9cb4d704a5d9a66a5b8058a4f7aa8e54.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/45d4b96f.5f8baf39.js b/ko/assets/js/45d4b96f.5f8baf39.js deleted file mode 100644 index 64703567c..000000000 --- a/ko/assets/js/45d4b96f.5f8baf39.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[6216],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=o.createContext({}),l=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(n),m=a,h=d["".concat(p,".").concat(m)]||d[m]||s[m]||r;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var l=2;l\n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.rs\n \u2514\u2500\u2500 examples\n \u2514\u2500\u2500 schema.rs \n")),(0,r.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,r.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm and schema files are returned."),(0,r.kt)("img",{src:n(4443).Z,alt:"juno-compile",style:{width:"318px"}}),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can check the returned wasm file and schema files in ",(0,r.kt)("inlineCode",{parentName:"p"},"juno//artifacts")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"juno//schema"),"."),(0,r.kt)("p",{parentName:"admonition"},"If you need to revise the contract and compile again, delete the ",(0,r.kt)("inlineCode",{parentName:"p"},"artifacts"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"schema")," directory and click the compile button.")),(0,r.kt)("h2",{id:"store-code"},"Store Code"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,r.kt)("inlineCode",{parentName:"p"},"Store Code")," button will be activated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Gas price is set to 0.025 ujuno/ujunox as a default and can be modified. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": Click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Store Code")," button."),(0,r.kt)("img",{src:n(42724).Z,alt:"juno-store-code",style:{width:"70%"}}),(0,r.kt)("h2",{id:"instantiate-the-contract"},"Instantiate the Contract"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,r.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": If there are arguments for contract instantiation, input the parameters and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Instantiate")," button. The arguments are generated through ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/rjsf-team/react-jsonschema-form"},"react-jsonschema-form"),"."),(0,r.kt)("img",{src:n(37738).Z,alt:"juno-instantiate",style:{width:"318px"}}),(0,r.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,r.kt)("inlineCode",{parentName:"p"},"Query")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"Execute")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,r.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,r.kt)("img",{src:n(77713).Z,alt:"juno-execute",style:{width:"100%"}}))}m.isMDXComponent=!0},4443:function(e,t,n){t.Z=n.p+"assets/images/compile-juno-852c3ad053bd41501e0764375a4c0bd1.png"},77713:function(e,t,n){t.Z=n.p+"assets/images/juno-execute-2ab9815326223dab1f0ac8cb69ff500d.png"},37738:function(e,t,n){t.Z=n.p+"assets/images/juno-instantiate-c6e7b24f3228e6457d1fb5f9492cb96d.png"},42724:function(e,t,n){t.Z=n.p+"assets/images/juno-store-code-289df63ac1d4ac3150cc0b25b6bff3e7.png"},56488:function(e,t,n){t.Z=n.p+"assets/images/template-code-juno-89e4d17b19e0bc9954b9b3a7677cdbe3.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/45d4b96f.f997285c.js b/ko/assets/js/45d4b96f.f997285c.js new file mode 100644 index 000000000..62dc7bb21 --- /dev/null +++ b/ko/assets/js/45d4b96f.f997285c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwelldone_docs=self.webpackChunkwelldone_docs||[]).push([[6216],{3905:function(e,t,n){n.d(t,{Zo:function(){return u},kt:function(){return m}});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=o.createContext({}),l=function(e){var t=o.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=l(e.components);return o.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},s=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,p=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),s=l(n),m=a,h=s["".concat(p,".").concat(m)]||s[m]||d[m]||r;return n?o.createElement(h,i(i({ref:t},u),{},{components:n})):o.createElement(h,i({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=s;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var l=2;l\n \u251c\u2500\u2500 Cargo.toml\n \u2514\u2500\u2500 src\n \u2514\u2500\u2500 contract.rs\n \u2514\u2500\u2500 examples\n \u2514\u2500\u2500 schema.rs \n")),(0,r.kt)("h2",{id:"compile-the-contract"},"Compile the Contract"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"We now only support the AMD compilation server.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the project you want to compile in the ",(0,r.kt)("strong",{parentName:"p"},"TARGET PROJECT")," section."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Select a compilation option and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Compile")," button."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": When the compilation is complete, a wasm and schema files are returned."),(0,r.kt)("img",{src:n(4443).Z,alt:"juno-compile",style:{width:"318px"}}),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You can check the returned wasm file and schema files in ",(0,r.kt)("inlineCode",{parentName:"p"},"juno//artifacts")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"juno//schema"),"."),(0,r.kt)("p",{parentName:"admonition"},"If you need to revise the contract and compile again, delete the ",(0,r.kt)("inlineCode",{parentName:"p"},"artifacts"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"schema")," directory and click the compile button.")),(0,r.kt)("h2",{id:"store-code"},"Store Code"),(0,r.kt)("admonition",{type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": If you have a compiled contract code, then ",(0,r.kt)("inlineCode",{parentName:"p"},"Store Code")," button will be activated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Gas price is set to 0.025 ujuno/ujunox as a default and can be modified. "),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 3"),": Click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Store Code")," button."),(0,r.kt)("img",{src:n(42724).Z,alt:"juno-store-code",style:{width:"70%"}}),(0,r.kt)("h2",{id:"instantiate-the-contract"},"Instantiate the Contract"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": When the Store Code is completed, a ",(0,r.kt)("inlineCode",{parentName:"p"},"Code ID")," is generated."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": If there are arguments for contract instantiation, input the parameters and click the ",(0,r.kt)("inlineCode",{parentName:"p"},"Instantiate")," button. The arguments are generated through ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/rjsf-team/react-jsonschema-form"},"react-jsonschema-form"),"."),(0,r.kt)("img",{src:n(37738).Z,alt:"juno-instantiate",style:{width:"318px"}}),(0,r.kt)("h2",{id:"execute-the-contract"},"Execute the Contract"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 1"),": Select the method to run."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 2"),": Add parameters as you needed."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Step 4"),": Run the method via clicking ",(0,r.kt)("inlineCode",{parentName:"p"},"Query")," or ",(0,r.kt)("inlineCode",{parentName:"p"},"Execute")," button. If you are sending a transaction, you must sign the transaction by clicking the ",(0,r.kt)("inlineCode",{parentName:"p"},"Send")," button in the ",(0,r.kt)("strong",{parentName:"p"},"WELLDONE Wallet"),"."),(0,r.kt)("img",{src:n(77713).Z,alt:"juno-execute",style:{width:"100%"}}))}m.isMDXComponent=!0},4443:function(e,t,n){t.Z=n.p+"assets/images/compile-juno-852c3ad053bd41501e0764375a4c0bd1.png"},77713:function(e,t,n){t.Z=n.p+"assets/images/juno-execute-2ab9815326223dab1f0ac8cb69ff500d.png"},37738:function(e,t,n){t.Z=n.p+"assets/images/juno-instantiate-c6e7b24f3228e6457d1fb5f9492cb96d.png"},42724:function(e,t,n){t.Z=n.p+"assets/images/juno-store-code-289df63ac1d4ac3150cc0b25b6bff3e7.png"},56488:function(e,t,n){t.Z=n.p+"assets/images/template-code-juno-89e4d17b19e0bc9954b9b3a7677cdbe3.png"}}]); \ No newline at end of file diff --git a/ko/assets/js/runtime~main.8de999b3.js b/ko/assets/js/runtime~main.41344f51.js similarity index 95% rename from ko/assets/js/runtime~main.8de999b3.js rename to ko/assets/js/runtime~main.41344f51.js index 48e699e1d..5b7ad5f49 100644 --- a/ko/assets/js/runtime~main.8de999b3.js +++ b/ko/assets/js/runtime~main.41344f51.js @@ -1 +1 @@ -!function(){"use strict";var e,f,c,n,a,t,d,r,o,b={},u={};function i(e){var f=u[e];if(void 0!==f)return f.exports;var c=u[e]={id:e,loaded:!1,exports:{}};return b[e].call(c.exports,c,c.exports,i),c.loaded=!0,c.exports}i.m=b,i.amdO={},e="function"==typeof Symbol?Symbol("webpack queues"):"__webpack_queues__",f="function"==typeof Symbol?Symbol("webpack exports"):"__webpack_exports__",c="function"==typeof Symbol?Symbol("webpack error"):"__webpack_error__",n=function(e){e&&!e.d&&(e.d=1,e.forEach((function(e){e.r--})),e.forEach((function(e){e.r--?e.r++:e()})))},i.a=function(a,t,d){var r;d&&((r=[]).d=1);var o,b,u,i=new Set,s=a.exports,l=new Promise((function(e,f){u=f,b=e}));l[f]=s,l[e]=function(e){r&&e(r),i.forEach(e),l.catch((function(){}))},a.exports=l,t((function(a){var t;o=function(a){return a.map((function(a){if(null!==a&&"object"==typeof a){if(a[e])return a;if(a.then){var t=[];t.d=0,a.then((function(e){d[f]=e,n(t)}),(function(e){d[c]=e,n(t)}));var d={};return d[e]=function(e){e(t)},d}}var r={};return r[e]=function(){},r[f]=a,r}))}(a);var d=function(){return o.map((function(e){if(e[c])throw e[c];return e[f]}))},b=new Promise((function(f){(t=function(){f(d)}).r=0;var c=function(e){e!==r&&!i.has(e)&&(i.add(e),e&&!e.d&&(t.r++,e.push(t)))};o.map((function(f){f[e](c)}))}));return t.r?b:d()}),(function(e){e?u(l[c]=e):b(s),n(r)})),r&&(r.d=0)},a=[],i.O=function(e,f,c,n){if(!f){var t=1/0;for(b=0;b=n)&&Object.keys(i.O).every((function(e){return i.O[e](f[r])}))?f.splice(r--,1):(d=!1,n0&&a[b-1][2]>n;b--)a[b]=a[b-1];a[b]=[f,c,n]},i.n=function(e){var f=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(f,{a:f}),f},d=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},i.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);i.r(c);var n={};t=t||[null,d({}),d([]),d(d)];for(var a=2&f&&e;"object"==typeof a&&!~t.indexOf(a);a=d(a))Object.getOwnPropertyNames(a).forEach((function(f){n[f]=function(){return e[f]}}));return n.default=function(){return e},i.d(c,n),c},i.d=function(e,f){for(var c in f)i.o(f,c)&&!i.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:f[c]})},i.f={},i.e=function(e){return Promise.all(Object.keys(i.f).reduce((function(f,c){return i.f[c](e,f),f}),[]))},i.u=function(e){return"assets/js/"+({50:"8cb1105e",53:"935f2afb",54:"5048ea5d",76:"20d68984",153:"259bd3b2",297:"5325762e",392:"1305a10c",429:"d462fdf3",653:"30a03d55",700:"d18953d0",734:"3f6c4f20",813:"24505e78",960:"824a93e2",1135:"9467f219",1335:"8623a4d6",1362:"3cd63f6d",1387:"e0f26f61",1399:"39ec3fb2",1520:"79b746e0",1584:"399fe57e",1600:"8fdec63b",1607:"e54443b0",1654:"8fc8f1ca",1852:"8ea81234",1948:"0899323c",2038:"e3030cff",2057:"35f04c0f",2132:"9be979fb",2569:"0499c826",2728:"8d13a701",2839:"adec426f",3648:"543fd3bb",3741:"fa2d34d8",3776:"2cc7cb9e",3972:"72fd910c",4012:"8a0c698b",4101:"4a4f7076",4176:"9a4ea0d9",4195:"c4f5d8e4",4400:"5ae0b73d",4425:"c2950ac0",4429:"e07456cf",4449:"bf84858a",4593:"88f4a476",4603:"4f7d0fd7",4940:"38eb1674",4986:"89e2994c",5042:"a22b3ec6",5117:"b9f33bd5",5141:"8b9d688e",5168:"5a421246",5530:"c6c64c1a",5555:"926b836d",5617:"bdb84528",5932:"fd068cfe",5945:"577c0e92",5982:"ad370160",5983:"363b7c43",6216:"45d4b96f",6325:"b3b5b621",6623:"cab051a9",6825:"cfbb4098",6851:"5cf94d79",6921:"68c9559d",6949:"cf4ea8da",7003:"4e3b88ac",7197:"9f204afa",7355:"51d86de4",7362:"2b9123c9",7404:"2fd193a5",7529:"ac8d6fb4",7855:"afbf5631",7918:"17896441",7920:"1a4e3797",7989:"e90d2489",8120:"00d4ce5d",8284:"6dbe1dd3",8317:"b93bf084",8318:"67e240e2",8542:"48a286d5",8836:"f5aec493",8887:"eed9a787",9005:"4d38b25a",9112:"3548220c",9282:"30101930",9445:"ada55f4f",9455:"ea1e44cd",9514:"1be78505",9567:"560e767c",9600:"28e7a53a",9657:"dcb20aac"}[e]||e)+"."+{50:"4b0378fc",53:"85b7031c",54:"ff4cf772",76:"2085ae29",153:"f0cdd1b0",297:"7b1e8221",392:"bb678727",429:"8f3e1f63",435:"6774149a",653:"6f34de7b",700:"40e5ca3f",734:"f9e8cf6c",813:"d808df93",854:"0bc00bc5",885:"ff0ea542",960:"6500b4a1",1135:"c4fd1175",1236:"4f1beb69",1335:"47eca76a",1362:"0aa37e95",1387:"ecdd8658",1399:"11c43813",1520:"57e08606",1584:"e43e4308",1600:"6e85062c",1607:"30995bb4",1654:"970161d3",1852:"0aee677b",1948:"acb41066",2038:"52e71a50",2057:"913d1f3f",2132:"3917241c",2569:"0302a410",2728:"3af3f2cc",2839:"93844946",3648:"331b49c5",3664:"03c198a6",3741:"e277802c",3776:"c5a4bff1",3972:"190b96b5",3979:"bdbf406c",4012:"2aaadba7",4101:"0c1f301c",4176:"c913f050",4195:"187dd515",4204:"ed7c913a",4400:"c69d40f7",4425:"75083d5e",4429:"8c27201d",4449:"633fbd2a",4593:"a094cc38",4603:"cc9e7c17",4724:"4449aa4d",4940:"a82bb413",4986:"3b6b040e",5042:"a4d6936a",5117:"e01f50c0",5141:"896d179b",5168:"dea3c63e",5381:"3876fa7c",5530:"3458da6c",5536:"38938bc5",5555:"4ecb12f0",5617:"27b23454",5932:"1ae7a185",5945:"3348ceef",5982:"57e57b9b",5983:"3bc84df1",6216:"5f8baf39",6325:"03480122",6426:"b8055b8b",6623:"42fc120c",6780:"c08f84f1",6825:"3ac16860",6851:"0c003e85",6921:"2f4dab47",6945:"65120ee6",6949:"3fe1a304",7003:"d25d6f3d",7197:"49d7e4c8",7355:"56a7f15b",7362:"b5aaa32f",7404:"868ab51c",7452:"3692dcd4",7506:"53fbf653",7529:"bf7c659d",7647:"f3555774",7855:"69fd050d",7918:"8c09902c",7920:"73c93701",7989:"b7a044b4",8120:"9f7af7c3",8284:"fe005c87",8317:"b4f07ad5",8318:"1b8c2181",8542:"228c0ea6",8836:"a53299d1",8887:"d0130961",9005:"de5a6b74",9055:"af57c60f",9112:"4be089aa",9282:"d72dd465",9435:"15372baa",9445:"28fdcd7b",9455:"bfd82724",9514:"7f6de34b",9567:"af9db9e6",9600:"db7f61fb",9657:"5dd35078",9674:"13919013",9958:"0dfe3a93"}[e]+".js"},i.miniCssF=function(e){},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=function(e,f){return Object.prototype.hasOwnProperty.call(e,f)},r={},o="welldone-docs:",i.l=function(e,f,c,n){if(r[e])r[e].push(f);else{var a,t;if(void 0!==c)for(var d=document.getElementsByTagName("script"),b=0;b=n)&&Object.keys(i.O).every((function(e){return i.O[e](f[r])}))?f.splice(r--,1):(d=!1,n0&&a[b-1][2]>n;b--)a[b]=a[b-1];a[b]=[f,c,n]},i.n=function(e){var f=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(f,{a:f}),f},d=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},i.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);i.r(c);var n={};t=t||[null,d({}),d([]),d(d)];for(var a=2&f&&e;"object"==typeof a&&!~t.indexOf(a);a=d(a))Object.getOwnPropertyNames(a).forEach((function(f){n[f]=function(){return e[f]}}));return n.default=function(){return e},i.d(c,n),c},i.d=function(e,f){for(var c in f)i.o(f,c)&&!i.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:f[c]})},i.f={},i.e=function(e){return Promise.all(Object.keys(i.f).reduce((function(f,c){return i.f[c](e,f),f}),[]))},i.u=function(e){return"assets/js/"+({50:"8cb1105e",53:"935f2afb",54:"5048ea5d",76:"20d68984",153:"259bd3b2",297:"5325762e",392:"1305a10c",429:"d462fdf3",653:"30a03d55",700:"d18953d0",734:"3f6c4f20",813:"24505e78",960:"824a93e2",1135:"9467f219",1335:"8623a4d6",1362:"3cd63f6d",1387:"e0f26f61",1399:"39ec3fb2",1520:"79b746e0",1584:"399fe57e",1600:"8fdec63b",1607:"e54443b0",1654:"8fc8f1ca",1852:"8ea81234",1948:"0899323c",2038:"e3030cff",2057:"35f04c0f",2132:"9be979fb",2569:"0499c826",2728:"8d13a701",2839:"adec426f",3648:"543fd3bb",3741:"fa2d34d8",3776:"2cc7cb9e",3972:"72fd910c",4012:"8a0c698b",4101:"4a4f7076",4176:"9a4ea0d9",4195:"c4f5d8e4",4400:"5ae0b73d",4425:"c2950ac0",4429:"e07456cf",4449:"bf84858a",4593:"88f4a476",4603:"4f7d0fd7",4940:"38eb1674",4986:"89e2994c",5042:"a22b3ec6",5117:"b9f33bd5",5141:"8b9d688e",5168:"5a421246",5530:"c6c64c1a",5555:"926b836d",5617:"bdb84528",5932:"fd068cfe",5945:"577c0e92",5982:"ad370160",5983:"363b7c43",6216:"45d4b96f",6325:"b3b5b621",6623:"cab051a9",6825:"cfbb4098",6851:"5cf94d79",6921:"68c9559d",6949:"cf4ea8da",7003:"4e3b88ac",7197:"9f204afa",7355:"51d86de4",7362:"2b9123c9",7404:"2fd193a5",7529:"ac8d6fb4",7855:"afbf5631",7918:"17896441",7920:"1a4e3797",7989:"e90d2489",8120:"00d4ce5d",8284:"6dbe1dd3",8317:"b93bf084",8318:"67e240e2",8542:"48a286d5",8836:"f5aec493",8887:"eed9a787",9005:"4d38b25a",9112:"3548220c",9282:"30101930",9445:"ada55f4f",9455:"ea1e44cd",9514:"1be78505",9567:"560e767c",9600:"28e7a53a",9657:"dcb20aac"}[e]||e)+"."+{50:"4b0378fc",53:"85b7031c",54:"ff4cf772",76:"2085ae29",153:"b8fcf6c3",297:"7b1e8221",392:"bb678727",429:"8f3e1f63",435:"6774149a",653:"6f34de7b",700:"40e5ca3f",734:"f9e8cf6c",813:"d808df93",854:"0bc00bc5",885:"ff0ea542",960:"6500b4a1",1135:"c4fd1175",1236:"4f1beb69",1335:"47eca76a",1362:"1710c5d0",1387:"ecdd8658",1399:"11c43813",1520:"57e08606",1584:"ba334781",1600:"6e85062c",1607:"30995bb4",1654:"970161d3",1852:"0aee677b",1948:"acb41066",2038:"52e71a50",2057:"913d1f3f",2132:"3917241c",2569:"0302a410",2728:"3af3f2cc",2839:"93844946",3648:"331b49c5",3664:"03c198a6",3741:"e277802c",3776:"c5a4bff1",3972:"190b96b5",3979:"bdbf406c",4012:"2aaadba7",4101:"0c1f301c",4176:"c913f050",4195:"187dd515",4204:"ed7c913a",4400:"c69d40f7",4425:"75083d5e",4429:"8c27201d",4449:"633fbd2a",4593:"a094cc38",4603:"cc9e7c17",4724:"4449aa4d",4940:"a82bb413",4986:"3b6b040e",5042:"a4d6936a",5117:"e01f50c0",5141:"896d179b",5168:"dea3c63e",5381:"3876fa7c",5530:"3458da6c",5536:"38938bc5",5555:"4ecb12f0",5617:"27b23454",5932:"1ae7a185",5945:"3348ceef",5982:"57e57b9b",5983:"068f5fff",6216:"f997285c",6325:"03480122",6426:"b8055b8b",6623:"42fc120c",6780:"c08f84f1",6825:"3ac16860",6851:"0c003e85",6921:"2f4dab47",6945:"65120ee6",6949:"3fe1a304",7003:"d25d6f3d",7197:"49d7e4c8",7355:"56a7f15b",7362:"b09c4301",7404:"868ab51c",7452:"3692dcd4",7506:"53fbf653",7529:"bf7c659d",7647:"f3555774",7855:"69fd050d",7918:"8c09902c",7920:"73c93701",7989:"b7a044b4",8120:"9f7af7c3",8284:"fe005c87",8317:"b4f07ad5",8318:"1b8c2181",8542:"228c0ea6",8836:"a53299d1",8887:"d0130961",9005:"de5a6b74",9055:"af57c60f",9112:"4be089aa",9282:"d72dd465",9435:"15372baa",9445:"28fdcd7b",9455:"bfd82724",9514:"7f6de34b",9567:"af9db9e6",9600:"db7f61fb",9657:"5dd35078",9674:"13919013",9958:"0dfe3a93"}[e]+".js"},i.miniCssF=function(e){},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=function(e,f){return Object.prototype.hasOwnProperty.call(e,f)},r={},o="welldone-docs:",i.l=function(e,f,c,n){if(r[e])r[e].push(f);else{var a,t;if(void 0!==c)for(var d=document.getElementsByTagName("script"),b=0;b - +
    -

    Aptos

    Create the Project

    Aptos는 Move Language를 사용하여 스마트 컨트랙트를 작성할 수 있습니다. WELLDONE Code는 Aptos와 Move Language에 입문하는 개발자들을 도와주기 위해 두 가지 기능을 제공합니다.

    Create Template

    Move Language로 작성된 간단한 샘플 컨트랙트 코드를 생성합니다. 원하는 템플릿 옵션을 선택한 후 Create Template 버튼을 눌러 샘플 컨트랙트 코드를 생성할 수 있습니다.

    template-code-aptos

    New Project

    스마트 컨트랙트를 작성하고자 하는 언어에 따른 컨트랙트 구조를 자동으로 생성합니다. 프로젝트의 이름을 작성한 후 New Project 버튼을 클릭하면 언어에 알맞은 컨트랙트 구조를 생성합니다.

    new-project-aptos

    정보

    WELLDONE Code에서 제공하는 기능을 이용하지 않고도 직접 컨트랙트 프로젝트를 생성할 수 있습니다. 단, 리믹스 플러그인을 통해 컴파일 및 배포하기 위해서는 aptos/ 폴더 내부에 컨트랙트를 작성해야 합니다. 새로 프로젝트를 생성한다면 프로젝트의 구조는 아래와 같아야 합니다.

    aptos
    └── <YOUR_PROJECT_NAME>
    ├── Move.toml
    └── sources
    └── YOUR_CONTRACT_FILE.move

    Compile the Contract

    Step 1: PROJECT TO COMPILE 섹션에서 컴파일하고자 하는 프로젝트를 선택합니다.

    Step 2: 컴파일 옵션을 선택한 후 Compile 버튼을 클릭합니다.

    Step 3: 컴파일이 완료되면 컴파일된 바이너리 파일이 반환됩니다.

    • PROJECT TO COMPILE 섹션에서 컴파일하고자 하는 프로젝트를 선택합니다.
    • 컴파일 방식을 선택합니다.
    • Complie 버튼을 클릭합니다.
    • 컴파일이 완료되면, wasm file이 반환됩니다.
    aptos-compile
    노트

    반환된 wasm 파일은 aptos/<YOUR_PROJECT_NAME>/out 디렉토리 안에 저장됩니다.

    단, 수정 후 컴파일을 다시 해야 한다면 프로젝트 내의 out 디렉토리를 삭제하고 다시 컴파일해야 합니다.

    정보

    현재 계정에 충분한 APT(약 0.3APT) 이상이 없으면, 트랜잭션에 서명이 불가능한 버그가 있습니다. 원인을 분석 중이며, 곧 해결하도록 하겠습니다. 개발하는데 참고하시기 바랍니다.

    Deploy the Contract

    WELLDONE Wallet에서는 해당 지갑 주소에 연결된 네트워크를 자동으로 감지하여 가져옵니다. 따라서 Deploy를 하기 이전에 메인넷에 트랜잭션을 보낼 것인지, 테스트넷에 트랜잭션을 보낼 것인지 미리 고려해두어야 합니다.

    Step 1: 컴파일이 완료된 컨트랙트 코드가 있는 경우 Deploy 버튼이 활성화됩니다.

    Step 2: Deploy 버튼 클릭 후 WELLDONE Wallet 창에서 Send버튼을 클릭하여 트랜잭션에 서명합니다.

    Deploy

    Step 3: 컨트랙트 배포가 성공하면 터미널에 트랜잭션 성공 로그가 출력되고, 컨트랙트를 실행시킬 수 있습니다.

    Deploy

    Execute the Contract

    정보

    컨트랙트를 가져오는 방법에는 두 가지가 있습니다.

    1. 위의 과정을 통해 배포한 컨트랙트를 자동으로 가져오는 방법
    2. At address 버튼을 통해 기존에 배포된 컨트랙트를 가져오는 방법

    Step 1: 현재 계정이 소유하고 있는 모듈과 리소스들을 확인할 수 있으며, Get Resource 버튼을 통해 해당 리소스를 읽어 올 수 있습니다.

    view-aptos

    Step 2: 원하는 함수를 선택하고, 필요에 따라 파라미터를 입력하면 해당 함수의 기능이 실행 됩니다. view 함수가 아닌 entry 함수의 경우에는 트랜잭션 서명과 요청이 필요하기 때문에 WELLDONE Wallet에서의 서명이 필요합니다.

    entry-aptos
    - +

    Aptos

    WELLDONE Code로 접속

    WELLDONE Code 플러그인 딥 링크를 통해 접속하면 WELLDONE Code 플러그인을 활성화할 수 있습니다.

    Create the Project

    Aptos는 Move Language를 사용하여 스마트 컨트랙트를 작성할 수 있습니다. WELLDONE Code는 Aptos와 Move Language에 입문하는 개발자들을 도와주기 위해 두 가지 기능을 제공합니다.

    Create Template

    Move Language로 작성된 간단한 샘플 컨트랙트 코드를 생성합니다. 원하는 템플릿 옵션을 선택한 후 Create Template 버튼을 눌러 샘플 컨트랙트 코드를 생성할 수 있습니다.

    template-code-aptos

    New Project

    스마트 컨트랙트를 작성하고자 하는 언어에 따른 컨트랙트 구조를 자동으로 생성합니다. 프로젝트의 이름을 작성한 후 New Project 버튼을 클릭하면 언어에 알맞은 컨트랙트 구조를 생성합니다.

    new-project-aptos

    정보

    WELLDONE Code에서 제공하는 기능을 이용하지 않고도 직접 컨트랙트 프로젝트를 생성할 수 있습니다. 단, 리믹스 플러그인을 통해 컴파일 및 배포하기 위해서는 aptos/ 폴더 내부에 컨트랙트를 작성해야 합니다. 새로 프로젝트를 생성한다면 프로젝트의 구조는 아래와 같아야 합니다.

    aptos
    └── <YOUR_PROJECT_NAME>
    ├── Move.toml
    └── sources
    └── YOUR_CONTRACT_FILE.move

    Compile the Contract

    Step 1: PROJECT TO COMPILE 섹션에서 컴파일하고자 하는 프로젝트를 선택합니다.

    Step 2: 컴파일 옵션을 선택한 후 Compile 버튼을 클릭합니다.

    Step 3: 컴파일이 완료되면 컴파일된 바이너리 파일이 반환됩니다.

    • PROJECT TO COMPILE 섹션에서 컴파일하고자 하는 프로젝트를 선택합니다.
    • 컴파일 방식을 선택합니다.
    • Complie 버튼을 클릭합니다.
    • 컴파일이 완료되면, wasm file이 반환됩니다.
    aptos-compile
    노트

    반환된 wasm 파일은 aptos/<YOUR_PROJECT_NAME>/out 디렉토리 안에 저장됩니다.

    단, 수정 후 컴파일을 다시 해야 한다면 프로젝트 내의 out 디렉토리를 삭제하고 다시 컴파일해야 합니다.

    정보

    현재 계정에 충분한 APT(약 0.3APT) 이상이 없으면, 트랜잭션에 서명이 불가능한 버그가 있습니다. 원인을 분석 중이며, 곧 해결하도록 하겠습니다. 개발하는데 참고하시기 바랍니다.

    Deploy the Contract

    WELLDONE Wallet에서는 해당 지갑 주소에 연결된 네트워크를 자동으로 감지하여 가져옵니다. 따라서 Deploy를 하기 이전에 메인넷에 트랜잭션을 보낼 것인지, 테스트넷에 트랜잭션을 보낼 것인지 미리 고려해두어야 합니다.

    Step 1: 컴파일이 완료된 컨트랙트 코드가 있는 경우 Deploy 버튼이 활성화됩니다.

    Step 2: Deploy 버튼 클릭 후 WELLDONE Wallet 창에서 Send버튼을 클릭하여 트랜잭션에 서명합니다.

    Deploy

    Step 3: 컨트랙트 배포가 성공하면 터미널에 트랜잭션 성공 로그가 출력되고, 컨트랙트를 실행시킬 수 있습니다.

    Deploy

    Execute the Contract

    정보

    컨트랙트를 가져오는 방법에는 두 가지가 있습니다.

    1. 위의 과정을 통해 배포한 컨트랙트를 자동으로 가져오는 방법
    2. At address 버튼을 통해 기존에 배포된 컨트랙트를 가져오는 방법

    Step 1: 현재 계정이 소유하고 있는 모듈과 리소스들을 확인할 수 있으며, Get Resource 버튼을 통해 해당 리소스를 읽어 올 수 있습니다.

    view-aptos

    Step 2: 원하는 함수를 선택하고, 필요에 따라 파라미터를 입력하면 해당 함수의 기능이 실행 됩니다. view 함수가 아닌 entry 함수의 경우에는 트랜잭션 서명과 요청이 필요하기 때문에 WELLDONE Wallet에서의 서명이 필요합니다.

    entry-aptos
    + \ No newline at end of file diff --git a/ko/code/deploy-and-run/celo/index.html b/ko/code/deploy-and-run/celo/index.html index de51a2e77..a7f09c5f6 100644 --- a/ko/code/deploy-and-run/celo/index.html +++ b/ko/code/deploy-and-run/celo/index.html @@ -8,13 +8,13 @@ - +

    Celo

    Create the Project

    Step 1: Celo에서 스마트 컨트랙트를 작성할 때는 Ethereum과 동일하게 Solidity로 컨트랙트를 작성합니다.

    Step 2: 작성한 스마트 컨트랙트 파일을 선택합니다.

    Select Project

    Compile the Contract

    Step 1: 컴파일하고자 하는 컨트랙트 파일을 선택하면 Compile 버튼이 활성화됩니다.

    Step 2: Complie 버튼을 클릭합니다.

    Project Compile

    Deploy the Contract

    WELLDONE Wallet에서는 해당 지갑 주소에 연결된 네트워크를 자동으로 감지하여 가져옵니다. 따라서 Deploy를 하기 이전에 메인넷에 트랜잭션을 보낼 것인지, 테스트넷에 트랜잭션을 보낼 것인지 미리 고려해두어야 합니다.

    Step 1: 컴파일이 완료된 컨트랙트 코드가 있는 경우, Deploy 버튼이 활성화됩니다.

    Step 2: Deploy 버튼을 클릭하고 WELLDONE Wallet 창에서 Send Tx 버튼을 클릭하여 트랜잭션에 서명합니다.

    Deploy

    Step 3: 컨트랙트 배포가 성공하면 터미널에 트랜잭션 성공 로그가 출력되고, 컨트랙트를 실행시킬 수 있습니다.

    Tx Success Log

    deployed-contract-celo

    Execute the Contract

    정보

    컨트랙트를 가져오는 방법에는 두 가지가 있습니다.

    1. 위의 과정을 통해 배포한 컨트랙트를 자동으로 가져오는 방법
    2. At address 버튼을 통해 기존에 배포된 컨트랙트를 가져오는 방법

    Step 1: 실행할 메소드를 선택합니다.

    Step 2: 필요에 따라 매개변수를 추가합니다.

    Step 3: call이나 transaction 버튼을 클릭하여 메소드를 실행합니다. 트랜잭션을 전송하는 경우, WELLDONE Wallet에서 Send Tx 버튼을 눌러 트랜잭션에 서명해야 합니다.

    Deployed Contract

    - + \ No newline at end of file diff --git a/ko/code/deploy-and-run/index.html b/ko/code/deploy-and-run/index.html index 8088f3c6b..4a3f9994b 100644 --- a/ko/code/deploy-and-run/index.html +++ b/ko/code/deploy-and-run/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/code/deploy-and-run/juno/index.html b/ko/code/deploy-and-run/juno/index.html index 65bb7ef1f..92ce4b6f9 100644 --- a/ko/code/deploy-and-run/juno/index.html +++ b/ko/code/deploy-and-run/juno/index.html @@ -8,13 +8,13 @@ - +
    -

    Juno

    정보

    Please refer to here to get started.

    Create the Project

    In Juno, you can write smart contracts with Rust language. WELLDONE Code provides two features to help developers new to Juno.

    Create Template

    Create a simple example contract code written in Rust. You can create a sample contract by selecting the template option and clicking the Create button. More templates may be found at Juno Samples.

    template-code-juno

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    정보

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory juno/. If you start a new project, the structure should look like the following.

    Writing Contracts in Rust

    juno
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── contract.rs
    └── examples
    └── schema.rs

    Compile the Contract

    정보

    We now only support the AMD compilation server.

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm and schema files are returned.

    juno-compile
    노트

    You can check the returned wasm file and schema files in juno/<YOUR_PROJECT_NAME>/artifacts and juno/<YOUR_PROJECT_NAME>/schema.

    If you need to revise the contract and compile again, delete the artifacts, schema directory and click the compile button.

    Store Code

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Store Code button will be activated.

    Step 2: Gas price is set to 0.025 ujuno/ujunox as a default and can be modified.

    Step 3: Click the Store Code button.

    juno-store-code

    Instantiate the Contract

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: If there are arguments for contract instantiation, input the parameters and click the Instantiate button. The arguments are generated through react-jsonschema-form.

    juno-instantiate

    Execute the Contract

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 4: Run the method via clicking Query or Execute button. If you are sending a transaction, you must sign the transaction by clicking the Send button in the WELLDONE Wallet.

    juno-execute
    - +

    Juno

    정보

    Please refer to here to get started.

    Connect to WELLDONE Code

    You can activate the WELLDONE Code plugin by accessing this deep link: WELLDONE Code Remix Plugin.

    Create the Project

    In Juno, you can write smart contracts with Rust language. WELLDONE Code provides two features to help developers new to Juno.

    Create Template

    Create a simple example contract code written in Rust. You can create a sample contract by selecting the template option and clicking the Create button. More templates may be found at Juno Samples.

    template-code-juno

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    정보

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory juno/. If you start a new project, the structure should look like the following.

    Writing Contracts in Rust

    juno
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── contract.rs
    └── examples
    └── schema.rs

    Compile the Contract

    정보

    We now only support the AMD compilation server.

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm and schema files are returned.

    juno-compile
    노트

    You can check the returned wasm file and schema files in juno/<YOUR_PROJECT_NAME>/artifacts and juno/<YOUR_PROJECT_NAME>/schema.

    If you need to revise the contract and compile again, delete the artifacts, schema directory and click the compile button.

    Store Code

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Store Code button will be activated.

    Step 2: Gas price is set to 0.025 ujuno/ujunox as a default and can be modified.

    Step 3: Click the Store Code button.

    juno-store-code

    Instantiate the Contract

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: If there are arguments for contract instantiation, input the parameters and click the Instantiate button. The arguments are generated through react-jsonschema-form.

    juno-instantiate

    Execute the Contract

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 4: Run the method via clicking Query or Execute button. If you are sending a transaction, you must sign the transaction by clicking the Send button in the WELLDONE Wallet.

    juno-execute
    + \ No newline at end of file diff --git a/ko/code/deploy-and-run/klaytn/index.html b/ko/code/deploy-and-run/klaytn/index.html index b2322f979..ec6b4e98f 100644 --- a/ko/code/deploy-and-run/klaytn/index.html +++ b/ko/code/deploy-and-run/klaytn/index.html @@ -8,13 +8,13 @@ - +

    Klaytn

    Create the Project

    Step 1: Klaytn에서 스마트 컨트랙트를 작성할 때는 Ethereum과 동일하게 Solidity로 컨트랙트를 작성합니다.

    Step 2: 작성한 스마트 컨트랙트 파일을 선택합니다.

    Select Project

    Compile the Contract

    Step 1: 컴파일하고자 하는 컨트랙트 파일을 선택하면 Compile 버튼이 활성화됩니다.

    Step 2: Complie 버튼을 클릭합니다.

    Project Compile

    Deploy the Contract

    WELLDONE Wallet에서는 해당 지갑 주소에 연결된 네트워크를 자동으로 감지하여 가져옵니다. 따라서 Deploy를 하기 이전에 메인넷에 트랜잭션을 보낼 것인지, 테스트넷에 트랜잭션을 보낼 것인지 미리 고려해두어야 합니다.

    Step 1: 컴파일이 완료된 컨트랙트 코드가 있는 경우, Deploy 버튼이 활성화됩니다.

    Step 2: Deploy 버튼을 클릭하고 WELLDONE Wallet 창에서 Send Tx 버튼을 클릭하여 트랜잭션에 서명합니다.

    Deploy

    Step 3: 컨트랙트 배포가 성공하면 터미널에 트랜잭션 성공 로그가 출력되고, 컨트랙트를 실행시킬 수 있습니다.

    Tx Success Log

    deployed-contract-klaytn

    Execute the Contract

    정보

    컨트랙트를 가져오는 방법에는 두 가지가 있습니다.

    1. 위의 과정을 통해 배포한 컨트랙트를 자동으로 가져오는 방법
    2. At address 버튼을 통해 기존에 배포된 컨트랙트를 가져오는 방법

    Step 1: 실행할 메소드를 선택합니다.

    Step 2: 필요에 따라 매개변수를 추가합니다.

    Step 3: call이나 transaction 버튼을 클릭하여 메소드를 실행합니다. 트랜잭션을 전송하는 경우, WELLDONE Wallet에서 Send Tx 버튼을 눌러 트랜잭션에 서명해야 합니다.

    Deployed Contract

    - + \ No newline at end of file diff --git a/ko/code/deploy-and-run/near/index.html b/ko/code/deploy-and-run/near/index.html index c70f2b925..fb4729ba1 100644 --- a/ko/code/deploy-and-run/near/index.html +++ b/ko/code/deploy-and-run/near/index.html @@ -8,13 +8,13 @@ - +
    -

    NEAR

    Create the Project

    NEAR는 AssemblyScript, Rust, JavaScript, TypeScript로 스마트 컨트랙트를 작성할 수 있습니다. 각 언어 별로 컨트랙트의 구조가 다르기 때문에 WELLDONE Code는 NEAR에 입문하는 개발자들을 도와주기 위해 두 가지 기능을 제공합니다.

    Create Template

    AssemblyScript, Rust, JavaScript, TypeScript로 작성된 간단한 샘플 컨트랙트 코드를 생성합니다. 원하는 템플릿 옵션을 선택한 후 Create Template 버튼을 눌러 샘플 컨트랙트 코드를 생성할 수 있습니다. 더 많은 예제 코드 소스는 NEAR Examples에서 확인하실 수 있습니다.

    template-code-near

    New Project

    스마트 컨트랙트를 작성하고자 하는 언어에 따른 컨트랙트 구조를 자동으로 생성합니다. 원하는 언어 옵션을 선택하고, 프로젝트의 이름을 작성한 후 New Project 버튼을 클릭하면 언어에 알맞은 컨트랙트 구조를 생성합니다.

    new-project-near

    정보

    WELLDONE Code에서 제공하는 기능을 이용하지 않고도 직접 컨트랙트 프로젝트를 생성할 수 있습니다. 단, 리믹스 플러그인을 통해 컴파일 및 배포하기 위해서는 near/ 폴더 내부에 컨트랙트를 작성해야 합니다. 새로 프로젝트를 생성한다면 프로젝트의 구조는 아래와 같아야 합니다.

    1. Rust로 컨트랙트를 작성하는 경우

    near
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── lib.rs

    2. AssemblyScript로 컨트랙트를 작성하는 경우

    near
    └── <YOUR_PROJECT_NAME>
    └── assembly
    ├── as_types.d.ts
    ├── index.ts
    └── tsconfig.json

    3. TypeScript로 컨트랙트를 작성하는 경우

    near
    └── <YOUR_PROJECT_NAME>
    ├── package.json
    ├── babel.config.json
    ├── tsconfig.json
    └── src
    └── contract.ts

    4. JavaScript로 컨트랙트를 작성하는 경우

    near
    └── <YOUR_PROJECT_NAME>
    ├── package.json
    ├── babel.config.json
    └── src
    └── contract.js

    Compile the Contract

    정보

    WELLDONE Code에서는 현재 Rust, CARGO-NEAR, EMBED-ABI, AseemblyScript, JavaScript, TypeScript 총 6가지 컴파일 옵션을 제공합니다. 현재는 AMD 컴파일 서버만 지원하고 있으며, 곧 ARM 컴파일 서버도 지원할 예정입니다.

    Step 1: PROJECT TO COMPILE 섹션에서 컴파일하고자 하는 프로젝트를 선택합니다.

    Step 2: 컴파일 옵션을 선택한 후 Compile 버튼을 클릭합니다.

    Step 3: 컴파일이 완료되면 wasm 파일이 반환됩니다.

    • PROJECT TO COMPILE 섹션에서 컴파일하고자 하는 프로젝트를 선택합니다.
    • 컴파일 방식을 선택합니다.
    • Complie 버튼을 클릭합니다.
    • 컴파일이 완료되면, wasm file이 반환됩니다.
    near-compile
    노트

    반환된 wasm 파일은 near/<YOUR_PROJECT_NAME>/out 디렉토리 안에 저장됩니다.

    단, 수정 후 컴파일을 다시 해야 한다면 프로젝트 내의 out 디렉토리를 삭제하고 다시 컴파일해야 합니다.

    1. Rust Compile

    cargo build 명령어를 사용하여 러스트로 작성된 스마트 컨트랙트를 컴파일합니다. 안정적인 컴파일을 제공하지만, 컨트랙트 실행 시 메소드의 params를 직접 입력해야 하는 불편함이 있습니다.

    2. CARGO-NEAR Compile (for Rust) - Experimental

    NEAR에서 공식적으로 개발 중인 cargo near를 이용하여 컴파일합니다. 컴파일이 성공하면 실행 가능한 wasm 바이너리 파일과 컨트랙트의 ABI가 담긴 json 파일이 함께 생성됩니다. cargo-near를 사용해서 컴파일한 컨트랙트를 배포하여 가져온 경우에는 메소드의 파라미터 타입을 알 수 있어 더욱 편하게 컨트랙트를 실행할 수 있습니다.

    하지만 해당 기능은 아직 개발 중인 기능이기 때문에, Cargo.toml 파일에서 near-sdk-rs 버전을 4.1.0 이상으로 지정해주어야 하고 컴파일 과정에서 예상치 못한 에러가 발생할 수 있습니다. 해당 프로젝트에 대한 자세한 정보는 NEAR의 공식 레포지토리에서 확인할 수 있습니다.

    3. EMBED-ABI Compile (for Rust) - Experimental

    cargo-near-embed-abi 옵션을 사용하면 ABI를 포함시킨 wasm 파일을 생성합니다. 해당 옵션을 사용하여 컴파일한 wasm 파일을 배포한 컨트랙트의 경우 At Address 버튼을 통해서 컨트랙트를 임포트할 때도 ABI 정보를 가져올 수 있습니다. 옵션에 대한 자세한 설명은 cargo-near 레포지토리를 참고해주세요.

    4. AssemblyScript Compile

    asbuild를 사용하여 AssemblyScript로 작성된 컨트랙트를 컴파일합니다. 안정적인 컴파일을 제공합니다.

    5. JavaScript & TypeScript Compile

    near-sdk-js를 사용하여 JavaScript 혹은 TypeScript로 작성된 컨트랙트를 컴파일합니다.

    노트

    JavaScript 혹은 TypeScript 컴파일 옵션을 사용하는 경우, 반드시 컴파일하고자 하는 컨트랙트 파일의 이름을 다음과 같이 지정해주어야 정상적으로 컴파일이 실행됩니다.

    • JavaScript: contract.js
    • TypeScript: contract.ts

    Deploy the Contract

    WELLDONE Wallet에서는 해당 지갑 주소에 연결된 네트워크를 자동으로 감지하여 가져옵니다. 따라서 Deploy를 하기 이전에 메인넷에 트랜잭션을 보낼 것인지, 테스트넷에 트랜잭션을 보낼 것인지 미리 고려해두어야 합니다.

    Step 1: 컴파일이 완료된 컨트랙트 코드가 있는 경우 Deploy 버튼이 활성화됩니다.

    Step 2: receive_id에 컨트랙트를 배포할 계정의 ID를 입력하고 Deploy 버튼을 클릭합니다. init function을 추가하고 싶다면 Deploy Option 을 클릭하여 메소드 이름과 인자를 추가합니다.

    deploy-option-near

    Step 3: 만약 해당 계정에 이미 배포된 컨트랙트가 있다면 한 번 더 사용자의 확인을 요청합니다.

    Step 4: WELLDONE Wallet 창에서 Send Tx 버튼을 클릭하여 트랜잭션에 서명합니다.

    Deploy

    Step 5: 컨트랙트 배포가 성공하면 터미널에 트랜잭션 성공 로그가 출력되고, 컨트랙트를 실행시킬 수 있습니다.

    deployed-contract-near

    Execute the Contract

    정보

    컨트랙트를 가져오는 방법에는 두 가지가 있습니다.

    1. 위의 과정을 통해 배포한 컨트랙트를 자동으로 가져오는 방법
    2. At address 버튼을 통해 기존에 배포된 컨트랙트를 가져오는 방법

    Step 1: 실행할 메소드를 선택합니다.

    Step 2: 필요에 따라 매개변수를 추가합니다.

    Step 3: Call 함수일 경우, 함수 호출과 함께 보낼 NEAR 토큰 양과 GAS LIMIT을 지정할 수 있습니다.

    Step 4: View 또는 Call 버튼을 클릭하여 메소드를 실행합니다. 트랜잭션을 전송하는 경우, WELLDONE Wallet에서 Send Tx 버튼을 눌러 트랜잭션에 서명해야 합니다.

    function-call
    정보

    CARGO-NEAR 혹은 EMBED-ABI 옵션을 선택하여 컴파일한 컨트랙트를 배포한 경우에는 실행할 메소드의 파라미터를 직접 입력하지 않고 ABI의 정보를 이용해서 더욱 간단하게 컨트랙트를 실행할 수 있습니다.

    cargo-nearcargo-near1cargo-near2
    - +

    NEAR

    WELLDONE Code로 접속

    WELLDONE Code 플러그인 딥 링크를 통해 접속하면 WELLDONE Code 플러그인을 활성화할 수 있습니다.

    Create the Project

    NEAR는 AssemblyScript, Rust, JavaScript, TypeScript로 스마트 컨트랙트를 작성할 수 있습니다. 각 언어 별로 컨트랙트의 구조가 다르기 때문에 WELLDONE Code는 NEAR에 입문하는 개발자들을 도와주기 위해 두 가지 기능을 제공합니다.

    Create Template

    AssemblyScript, Rust, JavaScript, TypeScript로 작성된 간단한 샘플 컨트랙트 코드를 생성합니다. 원하는 템플릿 옵션을 선택한 후 Create Template 버튼을 눌러 샘플 컨트랙트 코드를 생성할 수 있습니다. 더 많은 예제 코드 소스는 NEAR Examples에서 확인하실 수 있습니다.

    template-code-near

    New Project

    스마트 컨트랙트를 작성하고자 하는 언어에 따른 컨트랙트 구조를 자동으로 생성합니다. 원하는 언어 옵션을 선택하고, 프로젝트의 이름을 작성한 후 New Project 버튼을 클릭하면 언어에 알맞은 컨트랙트 구조를 생성합니다.

    new-project-near

    정보

    WELLDONE Code에서 제공하는 기능을 이용하지 않고도 직접 컨트랙트 프로젝트를 생성할 수 있습니다. 단, 리믹스 플러그인을 통해 컴파일 및 배포하기 위해서는 near/ 폴더 내부에 컨트랙트를 작성해야 합니다. 새로 프로젝트를 생성한다면 프로젝트의 구조는 아래와 같아야 합니다.

    1. Rust로 컨트랙트를 작성하는 경우

    near
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── lib.rs

    2. AssemblyScript로 컨트랙트를 작성하는 경우

    near
    └── <YOUR_PROJECT_NAME>
    └── assembly
    ├── as_types.d.ts
    ├── index.ts
    └── tsconfig.json

    3. TypeScript로 컨트랙트를 작성하는 경우

    near
    └── <YOUR_PROJECT_NAME>
    ├── package.json
    ├── babel.config.json
    ├── tsconfig.json
    └── src
    └── contract.ts

    4. JavaScript로 컨트랙트를 작성하는 경우

    near
    └── <YOUR_PROJECT_NAME>
    ├── package.json
    ├── babel.config.json
    └── src
    └── contract.js

    Compile the Contract

    정보

    WELLDONE Code에서는 현재 Rust, CARGO-NEAR, EMBED-ABI, AseemblyScript, JavaScript, TypeScript 총 6가지 컴파일 옵션을 제공합니다. 현재는 AMD 컴파일 서버만 지원하고 있으며, 곧 ARM 컴파일 서버도 지원할 예정입니다.

    Step 1: PROJECT TO COMPILE 섹션에서 컴파일하고자 하는 프로젝트를 선택합니다.

    Step 2: 컴파일 옵션을 선택한 후 Compile 버튼을 클릭합니다.

    Step 3: 컴파일이 완료되면 wasm 파일이 반환됩니다.

    • PROJECT TO COMPILE 섹션에서 컴파일하고자 하는 프로젝트를 선택합니다.
    • 컴파일 방식을 선택합니다.
    • Complie 버튼을 클릭합니다.
    • 컴파일이 완료되면, wasm file이 반환됩니다.
    near-compile
    노트

    반환된 wasm 파일은 near/<YOUR_PROJECT_NAME>/out 디렉토리 안에 저장됩니다.

    단, 수정 후 컴파일을 다시 해야 한다면 프로젝트 내의 out 디렉토리를 삭제하고 다시 컴파일해야 합니다.

    1. Rust Compile

    cargo build 명령어를 사용하여 러스트로 작성된 스마트 컨트랙트를 컴파일합니다. 안정적인 컴파일을 제공하지만, 컨트랙트 실행 시 메소드의 params를 직접 입력해야 하는 불편함이 있습니다.

    2. CARGO-NEAR Compile (for Rust) - Experimental

    NEAR에서 공식적으로 개발 중인 cargo near를 이용하여 컴파일합니다. 컴파일이 성공하면 실행 가능한 wasm 바이너리 파일과 컨트랙트의 ABI가 담긴 json 파일이 함께 생성됩니다. cargo-near를 사용해서 컴파일한 컨트랙트를 배포하여 가져온 경우에는 메소드의 파라미터 타입을 알 수 있어 더욱 편하게 컨트랙트를 실행할 수 있습니다.

    하지만 해당 기능은 아직 개발 중인 기능이기 때문에, Cargo.toml 파일에서 near-sdk-rs 버전을 4.1.0 이상으로 지정해주어야 하고 컴파일 과정에서 예상치 못한 에러가 발생할 수 있습니다. 해당 프로젝트에 대한 자세한 정보는 NEAR의 공식 레포지토리에서 확인할 수 있습니다.

    3. EMBED-ABI Compile (for Rust) - Experimental

    cargo-near-embed-abi 옵션을 사용하면 ABI를 포함시킨 wasm 파일을 생성합니다. 해당 옵션을 사용하여 컴파일한 wasm 파일을 배포한 컨트랙트의 경우 At Address 버튼을 통해서 컨트랙트를 임포트할 때도 ABI 정보를 가져올 수 있습니다. 옵션에 대한 자세한 설명은 cargo-near 레포지토리를 참고해주세요.

    4. AssemblyScript Compile

    asbuild를 사용하여 AssemblyScript로 작성된 컨트랙트를 컴파일합니다. 안정적인 컴파일을 제공합니다.

    5. JavaScript & TypeScript Compile

    near-sdk-js를 사용하여 JavaScript 혹은 TypeScript로 작성된 컨트랙트를 컴파일합니다.

    노트

    JavaScript 혹은 TypeScript 컴파일 옵션을 사용하는 경우, 반드시 컴파일하고자 하는 컨트랙트 파일의 이름을 다음과 같이 지정해주어야 정상적으로 컴파일이 실행됩니다.

    • JavaScript: contract.js
    • TypeScript: contract.ts

    Deploy the Contract

    WELLDONE Wallet에서는 해당 지갑 주소에 연결된 네트워크를 자동으로 감지하여 가져옵니다. 따라서 Deploy를 하기 이전에 메인넷에 트랜잭션을 보낼 것인지, 테스트넷에 트랜잭션을 보낼 것인지 미리 고려해두어야 합니다.

    Step 1: 컴파일이 완료된 컨트랙트 코드가 있는 경우 Deploy 버튼이 활성화됩니다.

    Step 2: receive_id에 컨트랙트를 배포할 계정의 ID를 입력하고 Deploy 버튼을 클릭합니다. init function을 추가하고 싶다면 Deploy Option 을 클릭하여 메소드 이름과 인자를 추가합니다.

    deploy-option-near

    Step 3: 만약 해당 계정에 이미 배포된 컨트랙트가 있다면 한 번 더 사용자의 확인을 요청합니다.

    Step 4: WELLDONE Wallet 창에서 Send Tx 버튼을 클릭하여 트랜잭션에 서명합니다.

    Deploy

    Step 5: 컨트랙트 배포가 성공하면 터미널에 트랜잭션 성공 로그가 출력되고, 컨트랙트를 실행시킬 수 있습니다.

    deployed-contract-near

    Execute the Contract

    정보

    컨트랙트를 가져오는 방법에는 두 가지가 있습니다.

    1. 위의 과정을 통해 배포한 컨트랙트를 자동으로 가져오는 방법
    2. At address 버튼을 통해 기존에 배포된 컨트랙트를 가져오는 방법

    Step 1: 실행할 메소드를 선택합니다.

    Step 2: 필요에 따라 매개변수를 추가합니다.

    Step 3: Call 함수일 경우, 함수 호출과 함께 보낼 NEAR 토큰 양과 GAS LIMIT을 지정할 수 있습니다.

    Step 4: View 또는 Call 버튼을 클릭하여 메소드를 실행합니다. 트랜잭션을 전송하는 경우, WELLDONE Wallet에서 Send Tx 버튼을 눌러 트랜잭션에 서명해야 합니다.

    function-call
    정보

    CARGO-NEAR 혹은 EMBED-ABI 옵션을 선택하여 컴파일한 컨트랙트를 배포한 경우에는 실행할 메소드의 파라미터를 직접 입력하지 않고 ABI의 정보를 이용해서 더욱 간단하게 컨트랙트를 실행할 수 있습니다.

    cargo-nearcargo-near1cargo-near2
    + \ No newline at end of file diff --git a/ko/code/deploy-and-run/neutron/index.html b/ko/code/deploy-and-run/neutron/index.html index 0be474fd6..a6f819461 100644 --- a/ko/code/deploy-and-run/neutron/index.html +++ b/ko/code/deploy-and-run/neutron/index.html @@ -8,13 +8,13 @@ - +
    -

    Neutron

    정보

    Please refer to here to get started.

    Create the Project

    In Neutron, you can write smart contracts with Rust language. WELLDONE Code provides two features to help developers new to Neutron.

    Create Template

    Create a simple example contract code written in Rust. You can create a sample contract by selecting the template option and clicking the Create button. More templates may be found at Neutron Samples.

    template-code-neutron

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    정보

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory neutron/. If you start a new project, the structure should look like the following.

    Writing Contracts in Rust

    neutron
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── contract.rs
    └── examples
    └── schema.rs

    Compile the Contract

    정보

    We now only support the AMD compilation server. The build environment is crucial for contract verification due to the non-deterministic nature of building Rust into Wasm.

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm and schema files are returned.

    neutron-compile
    노트

    You can check the returned wasm file and schema files in neutron/<YOUR_PROJECT_NAME>/artifacts and neutron/<YOUR_PROJECT_NAME>/schema.

    When you run the recompilation, the existing artifacts and schema folders will be deleted and the compilation process will start anew.

    Store Code

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Store Code button will be activated.

    Step 2: Gas price is set to 0.025 untrn/untrnx as a default and can be modified.

    Step 3: Click the Store Code button.

    neutron-store-code

    Instantiate the Contract

    노트

    You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: You can choose whether to allow contract upgrades or make them unmodifiable through the immutable option.

    Step 3: If there are arguments for contract instantiation, input the parameters and click the Instantiate button. The arguments are generated through react-jsonschema-form.

    neutron-instantiate

    Execute the Contract

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 4: Run the method via clicking Query or Execute button. If you are sending a transaction, you must sign the transaction by clicking the Send button in the WELLDONE Wallet.

    neutron-execute

    Migrate the Contract

    노트

    You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: Select the method as migrate.

    Step 3: Enter the target contract address for the migration and click the Migrate button.

    neutron-migrate
    - +

    Neutron

    정보

    Please refer to here to get started.

    Connect to WELLDONE Code

    You can activate the WELLDONE Code plugin by accessing this deep link: WELLDONE Code Remix Plugin.

    Create the Project

    In Neutron, you can write smart contracts with Rust language. WELLDONE Code provides two features to help developers new to Neutron.

    Create Template

    Create a simple example contract code written in Rust. You can create a sample contract by selecting the template option and clicking the Create button. More templates may be found at Neutron Samples.

    template-code-neutron

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    정보

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory neutron/. If you start a new project, the structure should look like the following.

    Writing Contracts in Rust

    neutron
    └── <YOUR_PROJECT_NAME>
    ├── Cargo.toml
    └── src
    └── contract.rs
    └── examples
    └── schema.rs

    Compile the Contract

    정보

    We now only support the AMD compilation server. The build environment is crucial for contract verification due to the non-deterministic nature of building Rust into Wasm.

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Select a compilation option and click the Compile button.

    Step 3: When the compilation is complete, a wasm and schema files are returned.

    neutron-compile
    노트

    You can check the returned wasm file and schema files in neutron/<YOUR_PROJECT_NAME>/artifacts and neutron/<YOUR_PROJECT_NAME>/schema.

    When you run the recompilation, the existing artifacts and schema folders will be deleted and the compilation process will start anew.

    Store Code

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Store Code button will be activated.

    Step 2: Gas price is set to 0.025 untrn/untrnx as a default and can be modified.

    Step 3: Click the Store Code button.

    neutron-store-code

    Instantiate the Contract

    노트

    You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: You can choose whether to allow contract upgrades or make them unmodifiable through the immutable option.

    Step 3: If there are arguments for contract instantiation, input the parameters and click the Instantiate button. The arguments are generated through react-jsonschema-form.

    neutron-instantiate

    Execute the Contract

    Step 1: Select the method to run.

    Step 2: Add parameters as you needed.

    Step 4: Run the method via clicking Query or Execute button. If you are sending a transaction, you must sign the transaction by clicking the Send button in the WELLDONE Wallet.

    neutron-execute

    Migrate the Contract

    노트

    You have the option to Instantiate or Migrate. In the current version, if you want to run either of them again, you need to start over from the compilation process. This will be updated in the future for greater convenience.

    Step 1: When the Store Code is completed, a Code ID is generated.

    Step 2: Select the method as migrate.

    Step 3: Enter the target contract address for the migration and click the Migrate button.

    neutron-migrate
    + \ No newline at end of file diff --git a/ko/code/deploy-and-run/sui/index.html b/ko/code/deploy-and-run/sui/index.html index b0aa47e10..f6369c385 100644 --- a/ko/code/deploy-and-run/sui/index.html +++ b/ko/code/deploy-and-run/sui/index.html @@ -8,14 +8,14 @@ - +
    -

    Sui

    정보

    Please refer to here to get started.

    Create the Project

    In Sui, you can write smart contracts with Move language. WELLDONE Code provides two features to help developers new to Sui and Move.

    Create Template

    Create a simple example contract code written in Move. You can create a sample contract by selecting the template option and clicking the Create button.

    template-code-sui

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    template-code-sui
    정보

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory sui/. If you start a new project, the structure should look like the following.

    sui
    └── <YOUR_PROJECT_NAME>
    ├── Move.toml
    ├── Move.lock
    └── sources
    └── YOUR_CONTRACT_FILE.move

    Compile the Contract

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Click the Compile button.

    Step 3: When the compilation is complete, a compiled binary file is returned.

    sui-compile
    노트

    You can check the returned compiled binary file in sui/<YOUR_PROJECT_NAME>/out directory.

    Deploy the Contract

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Click the Send button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 3 -: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    Deploy

    Execute the Contract

    정보

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: You can check the Packages, and Modules owned by the current account, and you can read the Objects through the Query Object button.

    Step 2: You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the WELLDONE Wallet is required because the transaction signature and request are required.

    entry-sui
    - +

    Sui

    정보

    Please refer to here to get started.

    Connect to WELLDONE Code

    You can activate the WELLDONE Code plugin by accessing this deep link: WELLDONE Code Remix Plugin.

    Create the Project

    In Sui, you can write smart contracts with Move language. WELLDONE Code provides two features to help developers new to Sui and Move.

    Create Template

    Create a simple example contract code written in Move. You can create a sample contract by selecting the template option and clicking the Create button.

    template-code-sui

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    template-code-sui
    정보

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory sui/. If you start a new project, the structure should look like the following.

    sui
    └── <YOUR_PROJECT_NAME>
    ├── Move.toml
    ├── Move.lock
    └── sources
    └── YOUR_CONTRACT_FILE.move

    Compile the Contract

    Step 1: Select the project you want to compile in the TARGET PROJECT section.

    Step 2: Click the Compile button.

    Step 3: When the compilation is complete, a compiled binary file is returned.

    sui-compile
    노트

    You can check the returned compiled binary file in sui/<YOUR_PROJECT_NAME>/out directory.

    Deploy the Contract

    The WELLDONE Wallet automatically finds and imports networks associated with your wallet address. As a result, before deploying, you should choose whether you want to send a transaction to mainnet or testnet.

    Step 1: If you have a compiled contract code, then Deploy button will be activated.

    Step 2: Click the Send button in the WELLDONE Wallet to sign the transaction.

    Deploy

    Step 3 +: A transaction success log will be printed to the terminal and the contract can be executed if contract deployment is successful.

    Deploy

    Execute the Contract

    정보

    There are two ways to import contracts.

    1. Automatically import contracts deployed through the above process.
    2. Import existing deployed contracts through At Address button.

    Step 1: You can check the Packages, and Modules owned by the current account, and you can read the Objects through the Query Object button.

    Step 2: You can select a function, enter parameters as needed, and click a button to run the function. For the entry function, not the view function, a signature from the WELLDONE Wallet is required because the transaction signature and request are required.

    entry-sui
    + \ No newline at end of file diff --git a/ko/code/getting-started/index.html b/ko/code/getting-started/index.html index a14569b72..05da8a244 100644 --- a/ko/code/getting-started/index.html +++ b/ko/code/getting-started/index.html @@ -8,14 +8,14 @@ - +
    -

    Getting Started

    How to connect to WELLDONE Code

    WELLDONE Code는 Remix IDE 공식 플러그인 입니다. Remix IDE 사이트로 방문하여 아래의 가이드를 따라주세요.

    Step 1: 왼쪽 바의 Plugin Manager 버튼을 클릭합니다.

    Plugin Manager

    Step 2: CODE BY WELLDONE STUDIO를 검색하여 Activate 버튼을 클릭합니다.

    Activate Plugin

    WELLDONE Code 플러그인이 성공적으로 추가되었다면 왼쪽 바에 나타난 아이콘을 클릭하여 WELLDONE Code를 실행할 수 있습니다.

    Select a Chain

    WELLDONE Code의 실행 첫 화면은 다음과 같습니다. Select a Chain 섹션에서 컨트랙트를 개발하고자 하는 체인을 선택해주세요.

    Documentation 버튼을 클릭하면 WELLDONE Docs로 이동하고, 사용 중 문제를 발견한 경우나 문의 사항이 있다면 Make an issue 버튼을 클릭하여 깃허브 레포지토리로 이동해 이슈를 자유롭게 생성해주세요.

    Select Chain

    Connect to WELLDONE Wallet

    WELLDONE Code를 사용하기 위해서는 체인을 선택한 후 제일 먼저 Connect to WELLDONE 버튼을 클릭하여 WELLDONE Wallet에 연결해야 합니다.

    WELLDONE Wallet이 설치되지 않은 경우 Install WELLDONE Wallet 이라는 에러가 발생하고, WELLDONE Wallet이 설치되어 있지만 지갑이 잠겨 있거나 해당 체인의 계정이 생성되어 있지 않은 경우 Unlock your WELLDONE Wallet OR Create Account 라는 에러가 발생합니다.

    Connect Wallet Install Error -Connect Wallet Locked

    아직 WELLDONE Wallet을 설치하지 않았다면 다음 매뉴얼을 따라 지갑을 설치•생성한 후, 선택한 체인의 계정을 생성해주세요. 마지막으로, 지갑의 Setting 탭에 들어가서 Developer Mode를 활성화 해주세요.

    Developer Mode

    지갑의 변경사항을 적용하기 위해서는 플러그인 오른쪽 상단의 새로고침 버튼을 클릭해야 합니다.

    WELLDONE Wallet과 성공적으로 연결된다면 연결된 계정의 이름과 토큰 잔액이 플러그인에 표시될 것입니다.

    Connect Wallet

    체인 별 WELLDONE Code의 사용법은 다음 섹션을 참고해주세요.


    Remix IDE 사용 방법에 대한 자세한 내용을 알고 싶다면 Remix IDE 공식 문서를 참조해주세요.

    - +

    Getting Started

    How to connect to WELLDONE Code

    WELLDONE Code는 Remix IDE 공식 플러그인 입니다. Remix IDE 사이트로 방문하여 아래의 가이드를 따라주세요.

    Step 1: 왼쪽 바의 Plugin Manager 버튼을 클릭합니다.

    Plugin Manager

    Step 2: CODE BY WELLDONE STUDIO를 검색하여 Activate 버튼을 클릭합니다.

    Activate Plugin

    WELLDONE Code 플러그인이 성공적으로 추가되었다면 왼쪽 바에 나타난 아이콘을 클릭하여 WELLDONE Code를 실행할 수 있습니다.

    Select a Chain

    WELLDONE Code의 실행 첫 화면은 다음과 같습니다. Select a Chain 섹션에서 컨트랙트를 개발하고자 하는 체인을 선택해주세요.

    Documentation 버튼을 클릭하면 WELLDONE Docs로 이동하고, 사용 중 문제를 발견한 경우나 문의 사항이 있다면 Make an issue 버튼을 클릭하여 깃허브 레포지토리로 이동해 이슈를 자유롭게 생성해주세요.

    Select Chain

    Connect to Wallet

    체인별 지원 지갑

    체인과 지원되는 지갑에 대한 정보는 아래 표를 참고하세요:

    체인지원 지갑
    NeutronKeplr Wallet, WELLDONE Wallet

    참고: 다른 체인의 지갑도 추가할 예정이니 플러그인의 업데이트를 통해 최신 지원 지갑을 확인하세요.

    Connect to WELLDONE Wallet

    WELLDONE Code를 사용하기 위해서는 체인을 선택한 후 제일 먼저 Connect to WELLDONE 버튼을 클릭하여 WELLDONE Wallet에 연결해야 합니다.

    WELLDONE Wallet이 설치되지 않은 경우 Install WELLDONE Wallet 이라는 에러가 발생하고, WELLDONE Wallet이 설치되어 있지만 지갑이 잠겨 있거나 해당 체인의 계정이 생성되어 있지 않은 경우 Unlock your WELLDONE Wallet OR Create Account 라는 에러가 발생합니다.

    Connect Wallet Install Error +Connect Wallet Locked

    아직 WELLDONE Wallet을 설치하지 않았다면 다음 매뉴얼을 따라 지갑을 설치•생성한 후, 선택한 체인의 계정을 생성해주세요. 마지막으로, 지갑의 Setting 탭에 들어가서 Developer Mode를 활성화 해주세요.

    Developer Mode

    지갑의 변경사항을 적용하기 위해서는 플러그인 오른쪽 상단의 새로고침 버튼을 클릭해야 합니다.

    WELLDONE Wallet과 성공적으로 연결된다면 연결된 계정의 이름과 토큰 잔액이 플러그인에 표시될 것입니다.

    Connect Wallet

    체인 별 WELLDONE Code의 사용법은 다음 섹션을 참고해주세요.


    Remix IDE 사용 방법에 대한 자세한 내용을 알고 싶다면 Remix IDE 공식 문서를 참조해주세요.

    + \ No newline at end of file diff --git a/ko/code/index.html b/ko/code/index.html index f18ecf7a4..c26822671 100644 --- a/ko/code/index.html +++ b/ko/code/index.html @@ -8,13 +8,13 @@ - +

    Code

    블록체인 네트워크마다 개발 환경이 다르기 때문에 개발자는 개발 대상 체인이 변경될 때마다 다시 개발 환경을 구축해야 합니다. 이는 새로운 체인을 항해하려는 Web3 여행자들에게 큰 부담이 됩니다. 따라서 WELLDONE Studio는 멀티 체인을 항해하려는 개발자들이 네트워크 별로 복잡한 개발 환경에 대한 걱정 없이 온전히 컨트랙트 개발과 테스트에 집중할 수 있는 WELLDONE Code를 제공합니다.

    WELLDONE Code는 Remix IDE 플러그인입니다. Remix는 솔리디티 언어를 위한 웹 기반 IDE로 주로 Ethereum 블록체인의 스마트 컨트랙트를 작성할 때 사용됩니다. Remix는 개발자들이 편리하고 사용자 친화적인 인터페이스를 사용해서 EVM 기반 스마트 컨트랙트를 작성, 테스트, 디버그할 수 있게 해줍니다. WELLDONE Code를 사용하면 개발자들은 EVM 기반 네트워크 뿐만 아니라 EVM 기반이 아닌 네트워크(NEAR, Cosmos 등)의 스마트 컨트랙트를 Remix IDE에서 손쉽게 개발하고 테스트할 수 있습니다.

    WELLDONE Code는 개발자가 네트워크 별로 개발 환경을 구축하지 않고도 스마트 컨트랙트를 작성할 수 있도록 지원하므로 각 체인 생태계에서 개발자를 온보딩하는 것에 있어서 탁월한 도구입니다.

    WELLDONE Code와 함께 당신의 멀티 체인 항해를 시작하세요!

    - + \ No newline at end of file diff --git a/ko/code/verification-api/cosmwasm/index.html b/ko/code/verification-api/cosmwasm/index.html index 893ea5d44..040a5a763 100644 --- a/ko/code/verification-api/cosmwasm/index.html +++ b/ko/code/verification-api/cosmwasm/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/code/verification-api/index.html b/ko/code/verification-api/index.html index 61ef0254a..c265b2ebf 100644 --- a/ko/code/verification-api/index.html +++ b/ko/code/verification-api/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/contribution/202211-batch-import/index.html b/ko/contribution/202211-batch-import/index.html index 7644c5644..6e8d02ca9 100644 --- a/ko/contribution/202211-batch-import/index.html +++ b/ko/contribution/202211-batch-import/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/contribution/near-welldone-migration/index.html b/ko/contribution/near-welldone-migration/index.html index 93ca857ca..fd72d15a6 100644 --- a/ko/contribution/near-welldone-migration/index.html +++ b/ko/contribution/near-welldone-migration/index.html @@ -8,13 +8,13 @@ - +

    Wellcome to WELLDONE Wallet!


    NEAR Wallet Migration Helper


    This page is a guide for moving your NEAR account to a personal wallet from the web wallet.

    The way existing NEAR web wallet moves your account
    What is uncomfortable about it?
    Creating and adding a full access key using a new mnemonic for each account, but the new wallet cannot use the mnemonic because it imports accounts using private key.

    The way NEAR Migration Helper moves your account
    What is more comfortable about it?
    Because creating a full access key from the wallet where you want to move your accounts, you can manage your accounts using both your private key and mnemonic.

    1. Create an Access Key through a new mnemonic.
    2. Register the generated Access Key as a Full Access Key to the account you want to transfer.
    3. Remove old Full Access Keys.
    4. Import account to wallet using Private key of new Full Access Key

    1. Connect to NEAR web wallet with the account you want to migrate.
    2. Create an Implicit account from a new wallet that will be transferred.
    3. Please copy the ID or Public Key of the generated Implicit account.
    4. In the NEAR Migration Helper, type the copied Public Key* and press the Set button.
    5. If there is no error, press the Full access key button that appears.
    6. Open a new wallet and check if the account you want to move has been added**.

    WELLDONE Studio recommends you to delete the full access key that was previously used in the web wallet.
    *: You can also use the ID of the Implicit account for the input value.
    **: Depending on your wallet, you may need to proceed with your import account again.

    To use NEAR Migration Helper

    - + \ No newline at end of file diff --git a/ko/execute-the-contract/index.html b/ko/execute-the-contract/index.html index 9a3c6f067..70e968828 100644 --- a/ko/execute-the-contract/index.html +++ b/ko/execute-the-contract/index.html @@ -8,14 +8,14 @@ - +

    Execute the Contract

    본 문서에서는 WELLDONE Wallet의 dapp:sendTransaction 메소드를 사용해서 체인별로 배포된 스마트 컨트랙트와 통신하는 방법을 간단한 카운터 예제를 통해 살펴보고자 합니다.

    우리가 사용할 카운터 예제는 체인별로 컨트랙트 세부 구현 사항은 조금씩 다르지만 공통으로 increment, reset 함수를 구현하고 있습니다. Solidity 수도코드로 간단하게 구현해보면 다음과 같습니다.

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;

    contract Counter {
       int private count = 0;

       constructor(uint256 _count) {
      count = _count;
      }

       function increment(uint256 _count) public {
           count += _count;
      }

       function reset(uint256 _count) public {
           count = _count
      }
    }

    스마트 컨트랙트와 통신하는 방법은 공통으로 아래와 같은 포맷을 통해 이뤄집니다. 파라미터로 CHAIN_NAMETRANSACTION_PARAMETER를 전달하는데, TRANSACTION_PARAMETER는 transaction을 string type으로 변환한 값을 의미합니다. 체인별로 transaction 포맷이 상이하기 때문에, WELLDONE Wallet에서는 아래와 같이 string 형으로 변환된 꼴을 공통으로 받아 트랜잭션을 전송하고 있습니다.

    type CHAIN_NAME = 'ethereum' | 'cosmos' | 'near' | 'solana' | 'klaytn' | 'celo' | 'neon';
    type TRANSACTION_PARAMETER = 'string';

    const response = await dapp.request(CHAIN_NAME, {
    method: 'dapp:sendTransaction',
    params: [TRANSACTION_PARAMETER],
    });
    const txHash = response.hash;

    아래의 체인별 섹션을 통해 체인별로 어떻게 컨트랙트와 통신할 수 있는지 상세하게 확인할 수 있습니다.

    - + \ No newline at end of file diff --git a/ko/getting-started/index.html b/ko/getting-started/index.html index e0801ef2b..6bbe5ece6 100644 --- a/ko/getting-started/index.html +++ b/ko/getting-started/index.html @@ -8,13 +8,13 @@ - +

    Getting Started

    WELLDONE Wallet을 사용하여 개발을 진행하기 위해서는 먼저 브라우저에 WELLDONE Wallet 익스텐션을 설치해주세요.

    노트

    이 가이드는 HTML, CSS 및 JavaScript에 대한 중급 지식을 갖추고 계신 분이 읽으시길 추천합니다.

    WELLDONE Wallet이 설치되면, 새 브라우저 탭에서 개발자 콘솔을 열어 window.dapp 객체가 있음을 확인합니다. WELLDONE Wallet에서는 사용자가 방문한 웹 사이트에 window.dapp이라는 전역 객체를 주입하고, 해당 객체를 이용해 웹 사이트와 WELLDONE Wallet이 통신할 수 있습니다. 아래의 섹션에서 브라우저에 지갑이 설치되어 있는지 확인하고 브라우저와 지갑을 연결하는 방법을 상세하게 알 수 있습니다.

    - + \ No newline at end of file diff --git a/ko/index.html b/ko/index.html index 062332876..0fedffdbb 100644 --- a/ko/index.html +++ b/ko/index.html @@ -8,13 +8,13 @@ - +

    Tools for Web3 Voyagers.

    다양한 목적의 블록체인 인프라를 사용자 친화적인 인터페이스로 구축합니다.

    WELLDONE Wallet

    하나의 프로바이더로 새로운 수준의 성능을 구현합니다. 모든 자산을 위한 단 하나의 지갑. 또한 여러 체인으로 쉽게 개발, 테스트 및 배포할 수 있습니다.

    WELLDONE Code

    생산성 향상을 위한 범용 코드. WELLDONE Code를 Remix IDE(개발 도구)에 적용하면 스마트 컨트랙트 개발할 때 다양한 언어와 컴파일러를 원활하게 사용할 수 있습니다.

    - + \ No newline at end of file diff --git a/ko/intro/index.html b/ko/intro/index.html index dc8040ecb..4fcbc3011 100644 --- a/ko/intro/index.html +++ b/ko/intro/index.html @@ -8,13 +8,13 @@ - +

    Introduction

    WELLDONE Studio 개발자 문서에 오신 것을 환영합니다! WELLDONE Studio는 웹3 여행자인 개발자들이 가장 필요로 하는 도구를 만듭니다. 흩어져 있는 경험을 한 데 모아 개발자의 개발이 보다 직관적이고 수월해 질 수 있도록 돕습니다. 그리고 더 많은 개발자가 웹3를 친숙하게 사용할 수 있도록 끊임없이 고민합니다. 우리는 여러분의 숨겨진 잠재력을 펼쳐내고, 올바른 방향으로 집중할 수 있게 하기 위해 존재합니다. WELLDONE Studio의 세 가지 도구들은 이러한 고민의 결과물입니다.

    WELLDONE Wallet을 이용하여 멀티체인 위에 계정을 생성할 수 있으며, AddChain을 이용하여 간편하게 체인을 추가하고, WELLDONE Code을 이용하여 Remix Ide 환경에서 쉽게 멀티체인 위의 컨트랙트를 배포하고 실행시킬 수 있습니다. 우리는 통합된 멀티 체인 개발 환경이 갖추어져야 웹3 개발자들이 자신의 아이디어를 마음껏 펼칠 수 있다고 믿습니다.

    여러분의 웹3 개발 여정을 도와줄 필수품들은 다음과 같습니다.


    WELLDONE Wallet

    A single wallet for all your assets

    체인의 제한 없이 모든 네트워크에서 자산을 관리할 수 있고 웹3 개발에 최적화된 지갑입니다. 수많은 블록체인 월렛에 흩어진 자산을 일일이 확인하는 것이 어려웠다면 다양한 네트워크를 지원하는 하나의 지갑, WELLDONE Wallet으로 통합된 웹3 경험을 시작할 수 있습니다. WELLDONE Wallet은 현재 셀레스티아(Celestia), 셀로(Celo), 코스모스(Cosmos), 이더리움(Ethereum), 주노(Juno), 클레이튼(Klaytn), 니어(NEAR), 네온(Neon), 솔라나(Solana), 뉴트론(neutron), 앱토스(Apos), Sui(수이) 총 12개 체인을 지원합니다

    Universal Provider

    Level up your performance with a single provider. For developers that want more.

    유니버셜 프로바이더(Universal Provider)는 웹3 개발자를 위해 탄생한 가장 효율적인 도구입니다. 웹 3.0 프로바이더를 단일 API로 통합하여 복잡한 개발 단계를 줄이고 여러분이 여러 체인의 네트워크에 손쉽게 연결해 원하는 서비스 개발에 집중할 수 있도록 돕습니다.

    How to use


    WELLDONE AddChain

    Multi-Chain Index for Web3

    WELLDONE AddChain은 여러 블록체인의 네트워크를 한 곳에서 추가하고 관리할 수 있는 서비스입니다. 새로운 블록체인이 등장할 때마다 네트워크를 추가하기 위해 이곳 저곳을 떠돌아야 했던 웹3 개발자들의 고충을 우리는 누구보다 잘 이해하고 있습니다. WELLDONE AddChain은 2022년 6월에 런칭되어 현재 코스모스(Cosmos), 이더리움(Ethereum), 솔라나(Solana) 총 3개 체인을 지원합니다.

    How to use

    • WELLDONE AddChain을 통해 네트워크를 추가하고 싶다면 이 링크를 참고합니다.

    WELLDONE Code

    Multi-Chain Plugin

    WELLDONE Code는 한 곳에서 여러 블록체인의 스마트 컨트랙트를 배포하고, 테스트해 볼 수 있는 효율적인 Remix IDE 플러그인입니다. 개발하는 체인이 변경될 때마다 개발 환경을 다시 구축해야 하는 어려움을 다들 경험해 보셨을 겁니다. WELLDONE Code는 스마트 컨트랙트 개발 환경이 다르기 때문에 발생하는 문제를 대신 해결해주며 개발자가 개발과 테스트에 온전히 집중할 수 있는 환경을 제공합니다.

    현재 셀로(Celo), 클레이튼(Klaytn), 니어(NEAR), 주노(Juno), 수이(Sui), 앱토스(Aptos) 등의 체인들을 지원합니다. 이외에도 다수의 체인들을 지원할 예정입니다.

    How to use

    • WELLDONE Code를 통해 컨트랙트를 배포하고자 한다면 이 링크를 참고합니다.
    • WELLDONE Code에 대한 보다 자세한 설명을 원한다면 이 포스팅을 참고합니다.

    What's next for WELLDONE Studio

    WELLDONE Studio범용적인(Universal), 기여하는(Contributory), 선도하는(Pioneering) 세가지의 핵심 가치를 가지고 웹3 참여자들이 일관된 경험으로 가치를 창출할 수 있도록 표준화된 도구를 제공합니다.

    멀티체인 환경에서 보다 일관된 경험으로 개발을 지속할 수 있도록 앞으로 더 다양한 체인을 지원할 예정이며, 기존에 구축되어 있는 SDK들에서도 WELLDONE Wallet을 주입해 사용할 수 있도록 지원할 예정입니다. 이러한 WELLDONE Studio의 프로덕트를 통해 서비스를 구축하고 싶다면 아래의 가이드를 참고합니다.

    1. WELLDONE Wallet Developer Guide
    2. WELLDONE AddChain Developer Guide
    3. WELLDONE Code Guide
    - + \ No newline at end of file diff --git a/ko/provider-api/index.html b/ko/provider-api/index.html index e4524c3e9..28d4fa7d9 100644 --- a/ko/provider-api/index.html +++ b/ko/provider-api/index.html @@ -8,13 +8,13 @@ - +

    Provider API

    정보

    처음 시작하시는 분이라면 다음 링크에서 간단한 사용법을 확인합니다.

    WELLDONE Wallet에서는 사용자가 방문한 웹 사이트에 window.dapp이라는 전역 객체를 주입합니다. window.dapp을 사용하면 단 하나의 개발 라이브러리만을 활용하여 여러 블록체인 네트워크와 통신할 수 있습니다.

    아래의 섹션에서 WELLDONE Wallet이 멀티 체인 환경을 지원하는 방법과 window.dapp을 활용하는 방법을 자세히 알아볼 수 있습니다.

    - + \ No newline at end of file diff --git a/ko/search/index.html b/ko/search/index.html index cc1dcf2a6..54a9873c2 100644 --- a/ko/search/index.html +++ b/ko/search/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/sending-transaction/index.html b/ko/sending-transaction/index.html index ded54a4ae..697541c0f 100644 --- a/ko/sending-transaction/index.html +++ b/ko/sending-transaction/index.html @@ -8,13 +8,13 @@ - +

    Sending Transactions

    노트

    트랜잭션을 전송하는 것은 블록체인의 공식적인 액션입니다. 이 액션은 간단한 토큰 전송, 새로운 스마트 컨트랙트 배포 및 다양한 방식으로 블록체인 상의 상태 변경을 유발할 수 있습니다. 트랜잭션을 전송한다는 것은 크게 트랜잭션 서명과 트랜잭션 전송 두 단계로 나눌 수 있는데, WELLDONE Wallet은 dapp:signAndSendTransaction 메소드를 통해 트랜잭션을 서명하고 전송하는 과정을 한 번에 진행할 수 있습니다.

    dapp:signAndSendTransaction 메소드의 파라미터로는 크게 CHAIN_NAMEHEX_STRING_TX_DATA가 있습니다. CHAIN_NAME은 연결하고자 하는 체인의 이름을, HEX_STRING_TX_DATA는 트랜잭션을 HEX string 형으로 변환한 값을 의미합니다. 다양한 체인들의 트랜잭션 포맷이 상이하기 때문에, WELLDONE Wallet에서는 트랜잭션을 HEX string 타입으로 변환한 값을 인자로 받아 트랜잭션을 전송합니다.

    EVM 계열의 경우 트랜잭션 객체를 그대로 넣어서 전송하는 것도 가능합니다.
    type CHAIN_NAME =
    | 'celestia'
    | 'celo'
    | 'cosmos'
    | 'ethereum'
    | 'juno'
    | 'klaytn'
    | 'near'
    | 'neon'
    | 'solana'
    | 'sui';
    type HEX_STRING_TX_DATA = 'string';

    const response = await window.dapp.request(CHAIN_NAME, {
    method: 'dapp:signAndSendTransaction',
    params: [HEX_STRING_TX_DATA],
    });

    체인별로 동일한 메소드 dapp:signAndSendTransaction를 사용하지만, 체인별로 트랜잭션 포맷이 다르기 때문에 HEX_STRING_TX_DATA를 만드는 방법에 차이가 있습니다. 아래의 체인별 섹션을 통해 체인별로 어떻게 요청을 보내는지 토큰을 전송하는 트랜잭션 예제와 함께 상세하게 알 수 있습니다.

    - + \ No newline at end of file diff --git a/ko/tutorials/aptos-account/index.html b/ko/tutorials/aptos-account/index.html index 5ded44734..f9e807751 100644 --- a/ko/tutorials/aptos-account/index.html +++ b/ko/tutorials/aptos-account/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/tutorials/aptos-account/object-model/index.html b/ko/tutorials/aptos-account/object-model/index.html index e44b4016e..7ec739d66 100644 --- a/ko/tutorials/aptos-account/object-model/index.html +++ b/ko/tutorials/aptos-account/object-model/index.html @@ -8,13 +8,13 @@ - +

    Object Model

    December 8, 2023
    Aladeenb (LAY)
    Blockchain Engineer, Townesquare

    Introduction

    Object model은 리소스 제어, 소유권 관리, 이벤트 발생 기능을 제공하여 체인 상호작용의 기능과 유연성을 향상시키는 종합적인 기능 프레임워크를 도입합니다.

    Object model의 주요 동기는 Move가 다양한 복잡한 타입들을 하나의 주소 내에 저장된 리소스 컬렉션으로 표현할 수 있도록 하는 것입니다.

    이러한 방식으로 리소스를 조직함으로써, 오브젝트는 NFT, 토큰, 게임 내 플레이어 오브젝트와 같은 특수 데이터 구조를 포괄할 수 있습니다. 이 모델은 타입 안전성 향상, 데이터 접근성 강화, 오브젝트에서 직접 이벤트를 발생시킬 수 있는 능력 등 여러 장점을 제공합니다.

    기존의 Aptos 데이터 모델은 Move 내의 store 능력에 의존하여, 구조체를 글로벌 저장소에 저장할 수 있습니다. 그러나 이 접근법에는 한계가 있습니다.

    • 제한된 데이터 접근성: 사용자 정의 리소스 내에 데이터를 배치함으로써 접근이 불가능하거나 해당 데이터에 대한 기대된 동작을 위반할 수 있습니다. 이는 사용자와 크리에이터에게 혼란을 야기할 수 있습니다.

    • 데이터 타임 혼합: 서로 다른 데이터 타입을 'any' 타입을 사용하여 단일 데이터 구조에 저장할 수 있지만, 이는 역직렬화로 인한 추가 비용을 발생시킵니다. 또한 개발자들이 특정 필드가 특정 타입을 대표하길 바랄 때 혼란을 초래할 수 있습니다.

    • 데이터 조합성 부족: Move는 현재 재귀적 데이터 구조에 대한 제한을 가지고 있어, 데이터의 조합성이 제한됩니다. 또한, 진정한 재귀적 데이터 구조는 보안 취약점을 야기할 수 있습니다.

    • 복잡한 데이터 참조: entry 함수 내에서 기존 데이터를 참조하는 것은 상당한 코드를 요구합니다. 문자열 검증을 위한 고유 키를 지원하는 것이 복잡해져 개발 효율성을 저해합니다.

    • 제한된 이벤트 발생: 이벤트는 계정에서만 발생할 수 있으며, 관련 데이터에서 직접적으로 발생할 수 없어서 이벤트 추적이 분리됩니다.

    • 비용이 많이 드는 전송 로직: 전송 로직이 모듈별 API에 제한되어, 발신자와 수신자 모두에게 불필요한 비용 부담과 자원 로딩을 초래합니다.

    object.move 분석

    Object model의 구성에 대해 자세히 살펴보겠습니다: 핵심 구조는 네 가지 구성 요소로 이루어져 있습니다.

    struct `ObjectCore` has key {
    guid_creation_num: u64,
    owner: address,
    allow_ungated_transfer: bool,
    transfer_events: event::EventHandle<TransferEvent>,
    }
    • guid_creation_num: 고유 식별자.
    • owner: 소유자의 주소(객체나 계정에 관련된 경우).
    • allow_ungated_transfer: 객체의 전송 가능 여부를 활성화하거나 비활성화하는 부울 변수입니다. 이 변수를 전송의 실행을 허용하는 열린(참) 상태와 제한하는 닫힌(거짓) 상태의 게이트로 상상해볼 수 있습니다.
    • transfer_events: 전송이 일어날 때마다 발생되는 전송 이벤트입니다.

    이 변수들은 각각 객체의 고유성, 소유권 세부 사항, 전송 가능 상태, 그리고 검색 가능성을 의미합니다. 애초에 핵심 구조를 포함함으로써, Move 프레임워크 내의 희소성 원칙이 효과적으로 검증됩니다.

    [희소성은 주어진 시스템 내에서 특정 객체나 자산의 제한된 가용성을 의미합니다.

    첫째, 각 객체에 할당된 guid_creation_num은 어떤 두 개체도 동일한 신원을 공유하지 않도록 보장합니다. 이 고유성은 희귀성과 독점성을 조성하여, 각 객체를 명확하게 식별하고 다른 것과 구별할 수 있습니다.

    둘째, 객체나 계정에 연관된 owner 주소는 희소성을 더욱 강화합니다. 명시적으로 소유자를 지정함으로써 객체에 대한 소유권과 통제성을 설정하고, 특정 개인이나 엔티티에게 가용성을 제한합니다. 이러한 소유 기반 제한은 소유권 이전이 의도적이고 통제된 방식으로 이루어지도록 함으로써 희소성을 유지하는 데 도움이 됩니다.

    allow_ungated_transfer는 전송을 활성화하거나 비활성화하는 게이트로서, 희소성 강화에 추가적인 레이어를 추가합니다. 전송을 규제하고 제한할 수 있는 능력을 제공함으로써, 이 모델은 소유자가 객체가 언제, 누구에게 전송될 수 있는지 결정할 수 있게 합니다. 이 메커니즘은 무단 또는 원치 않는 전송을 방지하여, 소유권 통제를 통해 객체의 희소성을 강화합니다.

    마지막으로, 전송이 일어날 때마다 발생되는 transfer_events는 시스템의 전반적인 탐지 가능성과 투명성에 기여합니다. 이 이벤트는 전송의 확인 및 기록으로 작용하여, 참가자들이 소유권 변경을 인지하고 객체 이동을 추적하는 데 도움이 됩니다. 전송 과정에 대한 가시성을 제공함으로써, 이 모델은 객체의 희소성이 명백하고 검증 가능하도록 보장합니다.]

    이러한 속성들이 객체 모델을 정의합니다.

    • 간소화된 저장 인터페이스.
    • 데이터 및 소유권 모델은 글로벌하게 접근 가능.
    • 확장 가능한 프로그래밍 모델.
    • 간소화된 저장 인터페이스: 객체 모델은 다양한 리소스들을 함께 저장할 수 있도록 지원하여, 서로 다른 데이터 타입들을 위한 공통의 핵심 데이터 레이어를 제공합니다. 즉, 다양한 데이터 타입들이 함께 저장될 수 있습니다.

    이 기능의 목적은 데이터 타입들이 공통 기능과 리소스를 공유하면서도 각 데이터 타입에 특화된 더 풍부한 확장을 허용하는 것입니다. 예를 들어, 핵심 데이터 계층은 모든 객체에 공통적인 공유 속성이나 특성을 포함할 수 있으며, 확장은 각 객체 타입(예: 콘서트 티켓 객체는 콘서트 이벤트와 관련된 추가 속성을 가질 수 있음)에 특화된 추가적인 속성이나 행동을 포함할 수 있습니다.

    저장 및 검색 과정을 간소화하기 위해, 객체 내의 리소스들은 동일한 저장소를 공유합니다. #[resource_group(scope = global)]

    이는 또한 다양한 리소스 타입들 사이에서 공통의 데이터 구조나 핵심 데이터 계층의 공유를 가능하게 합니다. 예를 들어, 객체 내의 모든 리소스는 공통적인 토큰 세트나 기본 데이터 필드를 공유할 수 있습니다. #[resource_group_member(group = aptos_framework::object::ObjectGroup)]

    Object<phantom T> 구조체는 다양한 타입의 객체들을 통합된 방식으로 저장하고 검색할 수 있게 하여, Move 저장소에 저장된 객체들과 상호작용하기 위한 간소화된 인터페이스를 제공합니다.

    • 데이터 및 소유권 모델은 글로벌하게 접근 가능합니다. 객체들과 그것들의 관련 데이터는 특정한 범위나 모듈에 국한되지 않고 글로벌하게 접근 가능하기 때문에 어디에서나 접근하고 관리할 수 있습니다.

    Structs

    • ObjectCore: 이 구조체는 객체의 핵심 속성을 정의합니다. 여기에는 소유자, 전송 가능성, 그리고 객체와 관련된 이벤트들이 포함됩니다. 이것은 객체의 소유권과 데이터 모델을 대표합니다.

    • Object<phantom T>: 이 구조체는 객체에 대한 포인터를 나타냅니다. 객체의 주소를 보유하며 기본 데이터에 대한 접근을 허용합니다. 이것은 객체의 데이터 모델을 대표합니다.

    • ConstructorRef, DeleteRef, ExtendRef, TransferRef, LinearTransferRef, DeriveRef: 이러한 구조체들은 객체의 생성, 삭제, 확장, 전송 및 파생과 같은 다양한 작업을 수행하기 위한 참조나 핸들을 나타냅니다. 이들은 객체의 소유권과 데이터 모델에 대한 접근을 제공합니다.

    Functions

    • create_named_object, create_object_from_account, generate_delete_ref, generate_extend_ref, etc.: 이 함수들은 객체를 생성하고, 참조를 생성하며, 객체에 대한 작업을 수행함으로써 객체 모델을 조작합니다. 이들은 객체의 데이터 및 소유권 모델과 상호 작용합니다.

    • 이 구조는 글로벌하게 접근 가능한 데이터 및 소유권 모델을 사용하여 객체를 생성하고 관리하는 것을 촉진하며, 객체에 대한 다양한 작업을 수행하고 이벤트 처리를 지원합니다.

    • 확장 가능한 프로그래밍 모델: 이는 객체의 원래 구현을 수정하지 않고 객체의 행동을 확장하고 사용자 정의할 수 있는 기능을 의미합니다. 개발자들이 기존 코드를 직접 수정하지 않고도 새로운 기능을 추가하거나 기존 행동을 수정하거나 특정 사용 사례에 맞게 객체를 특화할 수 있도록 합니다.

    이러한 구조체와 함수들은 객체를 생성, 구성, 확장, 전송, 파생, 변환, 삭제하는 메커니즘을 제공하여, 사용자 애플리케이션의 개별화를 가능하게 하고 핵심 프레임워크를 활용할 수 있게 합니다.

    노트

    일반적으로 입력 검증, 접근 제어, 적절한 이벤트 처리 및 단위 테스트는 잠재적 보안 취약점을 식별하는 데 효과적입니다.

    구현 예제 — Ticket as Object

    https://github.com/Aladeenb/simple-ticket

    이 모듈은 객체 모델의 간단한 티켓에 대한 구현입니다.

    • 티켓은 객체를 나타내며, price과 seat 두 가지 변수로 구성됩니다.
    • seat는 다른 객체를 나타내며, category와 price_modifier라는 두 가지 변수를 가지고 있으며, 업그레이드될 수 있습니다.
    • 더 자세한 내용을 확인하려면 클릭하십시오.
    노트

    TODO: 티켓은 전송될 수 있으므로, 그 기능을 추가합니다.


    Object model implementations within Aptos Framework:

    다음 구현 사항들은 다음 기사에서 설명됩니다.

    Aptos Token v2: an object-based token model

    Aptos Fungible Asset: an object-based fungible asset model

    Primary Fungible Store: a support module for managing and transferring fungible assets

    - + \ No newline at end of file diff --git a/ko/tutorials/aptos-account/resource-account/index.html b/ko/tutorials/aptos-account/resource-account/index.html index cc0b0a369..0e3629dd8 100644 --- a/ko/tutorials/aptos-account/resource-account/index.html +++ b/ko/tutorials/aptos-account/resource-account/index.html @@ -8,13 +8,13 @@ - +

    Resource Account

    December 6, 2023
    Sooyoung Hyun
    Lead Software Engineer, DSRV

    Introduction

    Aptos 계정 모델 중 하나인 리소스 계정에 대해 알아보겠습니다. Aptos 공식 문서에 나온 리소스 계정에 대한 내용을 바탕으로, 관련 내용들을 실습을 통해 확인해 보도록 하겠습니다.

    이더리움에서는 스마트 컨트랙트를 통해 자산(예: 토큰)을 관리하는 반면, Aptos는 사용자 계정 자체에서 이러한 자산을 '리소스'로 직접 관리할 수 있는 구조를 가지고 있습니다. 이 구조로 인해 Aptos에서는 리소스 계정이 필요합니다. 리소스 계정은 사용자 계정과 분리되어 독립적으로 작동하며, 이를 통해 리소스의 관리와 접근 제어가 가능합니다. 이러한 특성은 Aptos가 보다 복잡하고 다양한 블록체인 애플리케이션을 지원하며, 리소스의 안전한 관리와 효율적인 운영을 가능하게 하는 중요한 요소입니다.

    Resource Account

    리소스 계정 생성

    WELLDONE Wallet을 이용해서 Aptos의 일반 사용자 계정을 생성해보겠습니다.

    wallet-create-account

    그리고 터미널에서 Aptos CLI 를 이용하여 seed가 1인 리소스 계정을 생성해보도록 하겠습니다.

    참고로 여기서는 aptos-core 레포지토리를 클론하여 아래 경로에서 simple_exam 폴더와 move 파일을 만들어 진행 합니다.

    ./aptos-core/aptos-move/move-examples/simple_exam

    지갑에서 추출한 사용자 계정의 프라이빗 키를 이용해 Aptos CLI에 계정을 설정합니다.

    wallet-export-pk1wallet-export-pk2
    > aptos init --private-key <PRIVATE_KEY>
    wallet-import

    그 다음은 이 계정을 이용하여 리소스 계정을 생성 합니다. 특정 계정 주소와 seed의 해시로 리소스 계정이 만들어지기 때문에 특정 계정 주소와 seed에 대해 리소스 계정은 하나만 생성할 수 있습니다.

    creat-resource-account

    그리고 해당 리소스 계정에 faucet을 통해 코인을 전송 받습니다.

    fund-with-faucet

    익스플로러를 통해 방금 생성한 리소스 계정 주소를 조회해 보면 아직 인증키가 원래 사용자 계정에 있음을 알 수 있습니다. 리소스 계정이 여전히 사용자 계정의 통제 하에 있다는 것을 의미합니다.

    explorer-check-authkey

    패키지 배포

    이번에는 리소스 계정에 패키지를 배포해 보도록 하겠습니다.

    simple_exam
    └── .aptos
    └── config.yaml
    └── sources
    └── simple_example.move
    └── Move.toml
    // simple_example.move

    module simple_example::tutorial {
    use aptos_framework::resource_account;

    public entry fun retrieve_resource_account(resource_signer: &signer){
    resource_account::retrieve_resource_account_cap(resource_signer, @source_addr);
    }
    }

    // Move.toml

    [package]
    name = "Examples"
    version = "0.0.0"

    [addresses]
    source_addr = 'b6936414e726f849b4673a08ac35ba181fa991056d35a9bafa2e4b9395ea8581'
    resource_address = 'cc424539f912acb25003b831ee2033d28d1a4e64690038b9d726f702fdd7e994'
    simple_example = 'cc424539f912acb25003b831ee2033d28d1a4e64690038b9d726f702fdd7e994'

    [dependencies]
    AptosFramework = { local = "../../framework/aptos-framework" }

    // .aptos/config.yaml

    ---
    profiles:
    default:
    private_key: "<PRIVATE KEY>"
    public_key: "0x3637f1b86e33b47557f5941a3414bee8e2f10d14dd4ca0967a0c75eabfbedbee"
    account: b6936414e726f849b4673a08ac35ba181fa991056d35a9bafa2e4b9395ea8581
    rest_url: "https://fullnode.testnet.aptoslabs.com"
    faucet_url: "https://faucet.testnet.aptoslabs.com"
    resource:
    private_key: "<PRIVATE KEY>"
    public_key: "0x3637f1b86e33b47557f5941a3414bee8e2f10d14dd4ca0967a0c75eabfbedbee"
    account: cc424539f912acb25003b831ee2033d28d1a4e64690038b9d726f702fdd7e994
    rest_url: "https://fullnode.testnet.aptoslabs.com"
    faucet_url: "https://faucet.testnet.aptoslabs.com"

    이 코드는 simple_example::tutorial 모듈 내의 retrieve_resource_account 함수를 정의하고 있습니다. 이 함수는 리소스 계정의 Signer Capability를 회수하는 역할을 합니다. Signer Capability는 특정 계정의 권한을 다른 계정에 위임하는 기능을 제공합니다. 이를 통해, 리소스 계정이나 다른 계정이 필요한 행동을 할 수 있도록 하는 권한이 다른 계정에 임시적으로 부여됩니다. 이는 특히 리소스 계정이 독립적인 작업을 수행할 때 중요한 역할을 합니다.

    • resource_signer: &signer: 이 파라미터는 참조(&)를 통해 전달되는 서명자(signer) 객체입니다. 함수가 호출되는 동안 해당 서명자의 권한을 사용합니다.
    • resource_account::retrieve_resource_account_cap(...): 이 함수는 리소스 계정의 Signer Capability를 회수합니다. 여기서 resource_signer는 위에서 언급된 서명자 객체를 전달하고, @source_addr는 해당 함수에서 리소스 계정을 생성한 사용자 계정의 주소를 나타냅니다,

    다음 명령어를 통해 리소스 계정으로 패키지를 배포합니다.

    publish-package

    배포가 완료되면 익스플로러를 통해 상태를 확인할 수 있습니다. 패키지가 제대로 배포된 것을 확인할 수 있으며 여전히 인증키는 존재한다는 것도 확인할 수 있습니다. 인증키를 0으로 변경하여 리소스 계정을 독립적인 상태로 만들기 위해 필요한 함수가 바로 우리가 방금 배포한 resource_account::retrieve_resource_account_cap 함수 입니다.

    explorer-check-moduleexplorer-check-authkey

    인증키 변경

    resource_account::retrieve_resource_account_cap 함수를 호출하여 리소스 계정에 대한 권한을 부여하는 인증키를 없애보도록 하겠습니다.

    move-function-call

    익스플로러를 확인해보면 인증키가 0으로 변경되어 리소스 계정은 독립적인 상태가 된 것을 확인할 수 있습니다.

    explorer-check-authkey

    리소스 계정에 대해 조금 더 자세히 알아보도록 하겠습니다.

    리소스 계정을 생성할 때 이 Signer Capability가 생성되며, 해당 리소스 계정의 서명 기능을 허용합니다. 이는 특정 리소스 계정이 트랜잭션에 서명하거나, 리소스 계정이 소유한 자산에 대해 특정 조작을 수행할 수 있게 해줍니다.

    위의 예에서 리소스 계정이 retrieve_resource_account_cap 함수를 호출하면, 관련 Signer Capability을 찾고, 계정의 인증 키를 0x0으로 회전시켜서, Signer Capability 없이는 계정에 접근할 수 없게 만듭니다. 이 과정은 리소스 계정의 보안을 강화하며, 리소스 계정의 관리와 사용을 보다 안전하게 만들어줍니다. (참고로 init_module 함수를 이용해 패키지를 배포하는 시점에 키를 로테이션 시키는 것도 가능합니다.)

    아래는 해당 함수 코드입니다.

        public fun retrieve_resource_account_cap(
    resource: &signer,
    source_addr: address,
    ): account::SignerCapability acquires Container {
    assert!(exists<Container>(source_addr), error::not_found(ECONTAINER_NOT_PUBLISHED));

    let resource_addr = signer::address_of(resource);
    let (resource_signer_cap, empty_container) = {
    let container = borrow_global_mut<Container>(source_addr);
    assert!(simple_map::contains_key(&container.store, &resource_addr), error::invalid_argument(EUNAUTHORIZED_NOT_OWNER));
    let (_resource_addr, signer_cap) = simple_map::remove(&mut container.store, &resource_addr);
    (signer_cap, simple_map::length(&container.store) == 0)
    };

    if (empty_container) {
    let container = move_from(source_addr);
    let Container { store } = container;
    simple_map::destroy_empty(store);
    };

    account::rotate_authentication_key_internal(resource, ZERO_AUTH_KEY);
    resource_signer_cap
    }

    함수의 흐름을 살펴보면, 먼저 지정된 소스 주소(source_addr)에 'Container' 리소스가 존재하는지 확인합니다. 'Container'는 리소스 계정의 'SignerCapability'를 저장하는 데 사용되는 구조체입니다. 리소스 계정의 주소(resource_addr)를 이용해 해당 'SignerCapability'를 검색하고, 이를 리턴합니다.

    이 과정에서 중요한 부분은, 'SignerCapability'를 검색한 후, 리소스 계정의 인증 키를 'ZERO_AUTH_KEY'로 회전시키는 것입니다. 이는 리소스 계정이 더 이상 외부에서 접근할 수 없도록 하여 보안을 강화하는 조치입니다.

    간단히 말해, 이 함수의 호출을 통해 주어진 리소스 계정의 Signer Capability를 회수하고 인증키를 0으로 로테이션 시켜, 리소스 계정과 관련된 트랜잭션을 안전하게 관리할 수 있게 해줍니다.

    Aptos 공식 문서에 나오는 create_resource_account_and_publish_package 메소드를 사용해 리소스 계정을 생성과 동시에 인증키를 로테이션 시키고, 패키지를 배포하는 방법도 있습니다.

    aptos-core의 move-examples 중에서 2-Using-Resource-Account를 사용해 보겠습니다. 이전에 seed 1을 사용했었기 때문에 이번엔 seed를 2로 하여 리소스 계정을 생성하고, 패키지를 배포합니다.

    create_resource_account_and_publish_package

    새로 생성된 리소스 계정을 익스플로러에서 조회해 보면 패키지가 배포되었고, 인증키가 0으로 로테이션 된 것을 확인할 수 있습니다.

    explorer-check-codeexplorer-check-authkey

    아래는 해당 함수 코드입니다.

    /// Creates a new resource account, publishes the package under this account transaction under
    /// this account and leaves the signer cap readily available for pickup.
    public entry fun create_resource_account_and_publish_package(
    origin: &signer,
    seed: vector<u8>,
    metadata_serialized: vector<u8>,
    code: vector<vector<u8>>,
    ) acquires Container {
    let (resource, resource_signer_cap) = account::create_resource_account(origin, seed);
    aptos_framework::code::publish_package_txn(&resource, metadata_serialized, code);
    rotate_account_authentication_key_and_store_capability(
    origin,
    resource,
    resource_signer_cap,
    ZERO_AUTH_KEY,
    );
    }

    fun rotate_account_authentication_key_and_store_capability(
    origin: &signer,
    resource: signer,
    resource_signer_cap: account::SignerCapability,
    optional_auth_key: vector<u8>,
    ) acquires Container {
    let origin_addr = signer::address_of(origin);
    if (!exists<Container>(origin_addr)) {
    move_to(origin, Container { store: simple_map::create() })
    };

    let container = borrow_global_mut<Container>(origin_addr);
    let resource_addr = signer::address_of(&resource);
    simple_map::add(&mut container.store, resource_addr, resource_signer_cap);

    let auth_key = if (vector::is_empty(&optional_auth_key)) {
    account::get_authentication_key(origin_addr)
    } else {
    optional_auth_key
    };
    account::rotate_authentication_key_internal(&resource, auth_key);
    }

    이 메소드는 원본 계정(origin)에서 리소스 계정을 생성하고, 이 계정 아래에 패키지를 배포합니다. 리소스 계정과 관련된 Signer Capability(resource_signer_cap)가 생성되어, 리소스 계정이 자체적으로 트랜잭션을 서명할 수 있는 권한을 제공합니다. rotate_account_authentication_key_and_store_capability 함수는 리소스 계정의 인증 키를 회전시키고 Signer Capability를 안전하게 저장합니다.

    Conclusion

    이제까지 Aptos에서 리소스 계정을 생성하고 관리하는 방법, 그리고 패키지를 효과적으로 배포하는 방법에 대해 알아보았습니다. 이를 통해 Aptos의 리소스 계정에 대해 더 이해할 수 있는 계기가 되길 바랍니다.


    Reference

    https://aptos.dev/

    https://github.com/aptos-labs/aptos-core

    - + \ No newline at end of file diff --git a/ko/tutorials/aptos-account/standard-account/index.html b/ko/tutorials/aptos-account/standard-account/index.html index 85bd17f65..2161771c4 100644 --- a/ko/tutorials/aptos-account/standard-account/index.html +++ b/ko/tutorials/aptos-account/standard-account/index.html @@ -8,13 +8,13 @@ - +

    Standard Account

    November 29, 2023
    Sooyoung Hyun
    Lead Software Engineer, DSRV

    Introduction

    Aptos 블록체인에서 계정(Account) 모델은 사용자의 디지털 자산과 스마트 계약을 관리하는 핵심 요소입니다. Aptos에는 세 종류의 계정이 있습니다: 표준 계정은 일반적인 키 쌍이 있는 계정, 리소스 계정은 개발자가 사용하는 개인 키가 없는 독립형 계정, 그리고 오브젝트는 단일 주소에 저장된 복잡한 리소스 세트입니다. 이 세 유형의 계정은 각각 고유한 특성과 사용 사례를 가지고 있습니다. 이번 아티클에서는 주로 Standard Account의 특별한 기능들에 대해 다룹니다.

    Prerequisites
    • 블록체인 Ecosystem에 대한 기본적인 이해

    Standard Account

    계정 생성 및 관리

    Aptos 블록체인에서 각 계정의 상태는 두 가지 주요 요소로 구성됩니다. 그것은 Move modules와 Move resources 입니다.

    • 무브 모듈(Move modules): 이들은 코드를 포함합니다. 예를 들어, 타입(type)이나 절차(procedure)의 선언이 여기에 해당합니다. 하지만, 데이터는 포함하지 않습니다. 무브 모듈은 Aptos 블록체인의 전역 상태(global state)를 업데이트하는 규칙을 정의합니다.
    • 무브 리소스(Move resources): 반면, 무브 리소스는 데이터를 포함하지만 코드는 포함하지 않습니다. 무브 리소스의 각 값은 Aptos 블록체인에 발행된 어떤 모듈에서 선언된 타입을 갖습니다.

    Aptos에서 계정은 온체인 상에서 생성되며, 사용자는 지갑을 통해 새로운 계정를 생성할 수 있습니다. 하지만 온체인에서의 계정의 실제 활성화는 별도의 트랜잭션을 통해 이루어져야 합니다. 아래 이미지를 보면 지갑에서는 계정을 생성하였지만, 익스플로러에서는 조회가 되지 않는다는 것을 알 수 있습니다.

    wallet-create-accountexplorer-no-account

    여기서는 계정 활성화를 위해 faucet를 사용합니다. 이를 통해 사용자는 계정을 온체인에서 활성화 하고, 실제 Aptos 네트워크에서 거래를 시작할 수 있습니다. 이 내용에 대해 Aptos 공식 문서에는 아래와 같이 설명되어있습니다.

    노트

    Aptos 코인을 전송할 때 aptos_account::transfer를 통해 암시적으로 계정을 생성하거나 aptos_account::create_account를 통해 명시적으로 계정을 생성할 수 있도록 지원합니다.

    wallet-faucetexplorer-account-info

    faucet을 통해 활성화된 계정은 위와 같이 Aptos Explorer를 통해 계정의 주요 정보를 확인할 수 있습니다. 여기에는 계정 주소, 시퀀스 번호, 인증 키 등이 포함됩니다.

    여기서 guid는 발신자 주소와 카운터를 기반으로 생성된 글로벌하게 고유한 식별자를 의미하며, 계정의 sequence_number는 해당 계정에서 제출되어 온체인에 커밋된 트랜잭션의 수를 나타냅니다. authentication_key에 대해서는 조금 더 자세히 알아보겠습니다.

    인증 키 (Authentication Key)

    인증 키는 계정의 보안과 관련된 중요한 요소입니다. 이 키는 계정 생성 시에 설정되며, 필요에 따라 변경될 수 있습니다. 즉 사용자는 보안 상의 이유로 주기적으로 키 로테이션 기능을 통해 인증 키를 교체할 수 있습니다. 계정의 개인키가 노출 되었거나, 노출 되었을 가능성이 있다면, 기존 계정 주소는 그대로 유지하면서 기존 계정에 대한 개인키와 인증키를 변경하여 계정을 안전하게 지킬 수 있습니다.

    노트

    Aptos에서는 개인키-공개키 쌍에서 공개키로 계정의 주소와 매핑되는 authentication key 생성하고, 이것을 온체인에 매핑시켜둠으로써 계정과 인증키를 확인할 수 있습니다.

    예시를 통해 확인해보겠습니다. 아까 만들었던 계정에 대한 인증키를 변경해보도록하겠습니다.

    key-rotate

    aptos-cli의 rotate-key 기능을 이용해 인증키를 변경하였고, 익스플로러를 통해 원래 계정인 0x28a0…2c1에 대한 authencation_key가 변경되었음을 확인할 수 있습니다.

    change-key-info

    현재 지갑에는 바뀌기 전의 키가 저장되어 있기 때문에 지갑에 있는 이전 키를 통해 트랜잭션에 서명을 하고 전송할 경우 해당 트랜잭션은 당연히 실패를 하게 됩니다.

    fail-tx

    aptos-core 레포지토리에 있는 코드 예제를 살펴보도록 하겠습니다.

    이 코드는 Aptos 블록체인 네트워크를 사용하여 두 개의 새로운 계정을 생성하고, 이 계정들을 faucet으로 활성화 한 뒤 한 계정의 인증키(권한키)를 회전시키는 함수입니다. 사용된 주요 구성요소와 프로세스는 다음과 같습니다.

    AptosAccount 클래스를 사용하여 Alice와 Bob이라는 두 개의 새로운 계정을 생성합니다. 그리고 FaucetClient를 사용하여 이 두 계정에 자금을 전송합니다.

    // :!:>create_accounts
    const alice = new AptosAccount();
    const bob = new AptosAccount(); // <:!:create_accounts

    await faucetClient.fundAccount(alice.address(), 1 * Math.pow(10, APTOS_COIN_DECIMALS));
    await faucetClient.fundAccount(bob.address(), 1 * Math.pow(10, APTOS_COIN_DECIMALS));

    Alice의 인증키를 Bob의 비밀키로 변경합니다.

    const response = await provider.aptosClient.rotateAuthKeyEd25519(alice, bob.signingKey.secretKey); // <:!:rotate_key

    인증키가 변경된 후, 새로운 개인키와 기존 Alice의 주소를 사용하여 Alice의 계정 인스턴스를 새롭게 생성합니다.

    // We must create a new instance of AptosAccount because the private key has changed.
    const aliceNew = new AptosAccount(
    bob.signingKey.secretKey,
    alice.address(), // NOTE: Without this argument, this would be bob, not aliceNew. You must specify the address since the private key matches multiple accounts now
    );

    아래는 실행 결과 입니다. alice의 인증키가 bob의 것으로 변경된 것을 확인할 수 있습니다.

    ts-example-key-rotation

    Multisig Account

    Aptos 블록체인에서 멀티시그(Multisig, 다중 서명) 기능은 여러 개체(owners)의 승인을 필요로 하는 트랜잭션을 관리하는 중요한 메커니즘입니다. 이 기능은 보안을 강화하고, 공동 결정을 요구하는 경우에 특히 유용합니다. 예를 들어, 조직의 자금 관리나 중요한 계약 실행에 다수의 이해관계자 승인이 필요한 경우에 멀티시그를 사용할 수 있습니다.

    multisig_account.ts 스크립트를 사용하여 멀티시그 계정을 구현하는 방법을 확인해보도록 하겠습니다. 이 예시에서는 멀티시그 계정의 생성, 관리자 추가 및 제거, 서명 임계값 설정 변경 등을 다룹니다.

    예시 코드에 대한 시나리오와 주요 함수에 대한 설명입니다.

    세 명의 소유자(owner1, owner2, owner3)를 위한 Aptos 계정을 생성하고, 각 계정에 자금을 지원합니다.

    const owner1 = new AptosAccount();
    const owner2 = new AptosAccount();
    const owner3 = new AptosAccount();
    await faucetClient.fundAccount(owner1.address(), 100_000_000);
    await faucetClient.fundAccount(owner2.address(), 100_000_000);
    await faucetClient.fundAccount(owner3.address(), 100_000_000);

    멀티시그 계정 설정 (2-of-3): owner1을 사용하여 2-of-3 멀티시그 계정을 생성합니다. 이는 총 세 명의 소유자 중 두 명의 승인이 필요한 계정입니다.

    const payload: Gen.ViewRequest = {
    function: "0x1::multisig_account::get_next_multisig_account_address",
    arguments: [owner1.address().hex()],
    };
    const multisigAddress = (await client.view(payload))[0] as string;

    // Create the multisig account with 3 owners and a signature threshold of 2.
    const createMultisig = await client.generateTransaction(owner1.address(), {
    function: "0x1::multisig_account::create_with_owners",
    type_arguments: [],
    arguments: [[owner2.address().hex(), owner3.address().hex()], 2, ["Shaka"], [BCS.bcsSerializeStr("Bruh")]],
    });
    await client.generateSignSubmitWaitForTransaction(owner1, createMultisig.payload);

    멀티시그 계정 자금 지원: 생성된 멀티시그 계정에 자금을 지원합니다.

    await faucetClient.fundAccount(multisigAddress, 100_000_000);

    멀티시그 트랜잭션 생성 및 실행: 멀티시그 계정을 사용하여 코인을 전송하는 트랜잭션을 생성하고 실행합니다.

    const recipient = new AptosAccount();
    const transferTxPayload = new MultiSigTransactionPayload(
    EntryFunction.natural(
    "0x1::aptos_account", "transfer", [],
    [BCS.bcsToBytes(AccountAddress.fromHex(recipient.address())), BCS.bcsSerializeUint64(1_000_000)]
    ),
    );
    const createMultisigTx = await client.generateTransaction(owner2.address(), /*...*/);
    await client.generateSignSubmitWaitForTransaction(owner2, createMultisigTx.payload);

    멀티시그 트랜잭션 실행 (페이로드 해시 사용): 페이로드의 해시를 사용하여 또 다른 멀티시그 트랜잭션을 생성하고 실행합니다. 이 과정은 페이로드의 해시를 사용하여 보다 안전하고 효율적인 방법으로 트랜잭션을 생성하고 실행하는 과정을 의미합니다.

    const transferTxPayloadHash = sha3Hash.create();
    transferTxPayloadHash.update(BCS.bcsToBytes(transferTxPayload));
    const createMultisigTxWithHash = await client.generateTransaction(owner2.address(), {
    function: "0x1::multisig_account::create_transaction_with_hash",
    type_arguments: [],
    arguments: [multisigAddress, transferTxPayloadHash.digest()],
    });
    await client.generateSignSubmitWaitForTransaction(owner2, createMultisigTxWithHash.payload);

    멀티시그 계정 소유자 관리: 새로운 소유자를 멀티시그 계정에 추가하고, 이후 제거하는 과정을 진행합니다.

    const addOwnerPayload = new MultiSigTransactionPayload(
    EntryFunction.natural(
    "0x1::multisig_account", "add_owner", [],
    [BCS.bcsToBytes(AccountAddress.fromHex(owner_4.address()))]
    ),
    );
    const removeOwnerPayload = new MultiSigTransactionPayload(
    EntryFunction.natural(
    "0x1::multisig_account", "remove_owner", [],
    [BCS.bcsToBytes(AccountAddress.fromHex(owner_4.address()))]
    ),
    );

    서명 임계값 변경: 멀티시그 계정의 서명 임계값을 3-of-3으로 변경합니다.

    const changeSigThresholdPayload = new MultiSigTransactionPayload(
    EntryFunction.natural(
    "0x1::multisig_account", "update_signatures_required", [],
    [BCS.bcsSerializeUint64(3)]
    ),
    );

    거절 및 승인 함수 (rejectAndApprove): 멀티시그 트랜잭션을 거절하거나 승인하는 과정을 구현합니다.

    const rejectAndApprove = async (client, owner1, owner2, multisigAddress, transactionId) => {
    let rejectTx = await client.generateTransaction(
    owner1.address(),
    {
    function: "0x1::multisig_account::reject_transaction",
    arguments: [multisigAddress, transactionId],
    /* ... */
    }
    );
    let approveTx = await client.generateTransaction(
    owner2.address(),
    {
    function: "0x1::multisig_account::approve_transaction",
    arguments: [multisigAddress, transactionId],
    /* ... */
    }
    );
    };

    소유자 수 및 서명 임계값 조회 함수 (getNumberOfOwners, getSignatureThreshold): 멀티시그 계정의 소유자 수와 서명 임계값을 조회하는 기능을 구현합니다.

    const getNumberOfOwners = async (client, multisigAddress) => {
    const multisigAccountResource = await client.getAccountResource(
    multisigAddress, "0x1::multisig_account::MultisigAccount"
    );
    return Number((multisigAccountResource.data as any).owners.length);
    };
    const getSignatureThreshold = async (client, multisigAddress) => {
    const multisigAccountResource = await client.getAccountResource(
    multisigAddress, "0x1::multisig_account::MultisigAccount"
    );
    return Number((multisigAccountResource.data as any).num_signatures_required);
    };

    아래는 실행 결과 입니다.

    multisig-account

    Aptos의 멀티시그 기능은 블록체인 기술의 핵심 장점인 분산화된 신뢰와 보안을 한층 강화합니다. 이를 통해 사용자들은 자산 관리, 계약 실행 등 다양한 분야에서 더 높은 보안성을 확보할 수 있습니다. 이러한 멀티시그 메커니즘은 Aptos 블록체인이 제공하는 다양한 기능들 중 하나로, 탈중앙화된 응용 프로그램(Decentralized Applications, DApps) 개발에 있어 중요한 역할을 할 것으로 보입니다.

    Conclusion

    이 글을 통해 Aptos 블록체인의 계정 모델, 특히 Key rotation과 Multisig Account 기능에 대해 살펴보았습니다. Aptos 블록체인의 독특한 기능과 사용자 친화적인 계정 관리 시스템은 블록체인 기술의 발전과 그 적용 범위 확대에 중요한 역할을 하고 있습니다. 이러한 기능은 블록체인 기술의 미래와 이를 활용하는 다양한 애플리케이션 개발에 증요한 통찰을 제공하며, Aptos 생태계의 일원으로서 Aptos의 여정에 참여하는 데 도움이 될 것입니다.


    Reference

    https://aptos.dev/

    https://github.com/aptos-labs/aptos-core

    - + \ No newline at end of file diff --git a/ko/tutorials/aptos-move-coin/index.html b/ko/tutorials/aptos-move-coin/index.html index f6308cbc9..86c5138c9 100644 --- a/ko/tutorials/aptos-move-coin/index.html +++ b/ko/tutorials/aptos-move-coin/index.html @@ -8,7 +8,7 @@ - + @@ -20,7 +20,7 @@ because you have already registered above. The receiver should call register before calling mint.

    aptos-moon-coin-mint
  • Check if the coin have been minted in Aptos Explorer Coins tab.

    aptos-moon-coin-minted
  • Try more...

    1. Call burn function and check it out in Aptos Explorer Coins tab.
    2. Create and switch to new account address and try register. Switch to the original address again and transfer or mint to the address you just newly created.

    Reference

    https://aptos.dev/tutorials/your-first-coin/

    - + \ No newline at end of file diff --git a/ko/tutorials/aptos-move-prover/index.html b/ko/tutorials/aptos-move-prover/index.html index 5981c60b7..549bd4182 100644 --- a/ko/tutorials/aptos-move-prover/index.html +++ b/ko/tutorials/aptos-move-prover/index.html @@ -8,7 +8,7 @@ - + @@ -21,7 +21,7 @@ You can create a sample contract hello_prover by selecting the template option and clicking the Create Template button.

    template-code-aptos

    Source Code To Prove

    Note that plus1 function is intentionally implemented wrongly to see if move prover really works.

    prove.move
    module 0x42::prove {
    fun plus1(x: u64): u64 {
    // x+1
    x+2 // error intended
    }

    spec plus1 {
    ensures result == x+1;
    }

    fun abortsIf0(x: u64) {
    if (x == 0) {
    abort(0)
    };
    }

    spec abortsIf0 {
    aborts_if x == 0;
    }
    }

    Project To Prove

    Select the project you want to verify using move prover. For now, let's choose aptos/hello_prover

    new-project-aptos

    Prove

    Click the Prove button. This button trigger aptos cli command aptos move prove for your project.

    new-project-aptos

    Check Out The Result

    Move prover results in an error message because it found the error case which the result is not equal to x plus 1.

    new-project-aptos

    Correct The Source Code And Prove Again

    Comment out x+2 and uncomment x+1 and click Prove button again.

    prove.move
    module 0x42::prove {
    fun plus1(x: u64): u64 {
    x+1
    // x+2 // error intended
    }

    spec plus1 {
    ensures result == x+1;
    }

    fun abortsIf0(x: u64) {
    if (x == 0) {
    abort(0)
    };
    }

    spec abortsIf0 {
    aborts_if x == 0;
    }
    }

    You will see the verification success message like below.

    new-project-aptos


    Reference

    https://osec.io/blog/tutorials/2022-09-16-move-prover

    https://github.com/move-language/move/blob/main/language/move-prover/doc/user/prover-guide.md

    - + \ No newline at end of file diff --git a/ko/tutorials/index.html b/ko/tutorials/index.html index 351820618..6fed2fb4b 100644 --- a/ko/tutorials/index.html +++ b/ko/tutorials/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/tutorials/kms/aptos/index.html b/ko/tutorials/kms/aptos/index.html index b0c7ab49f..3e420b392 100644 --- a/ko/tutorials/kms/aptos/index.html +++ b/ko/tutorials/kms/aptos/index.html @@ -8,7 +8,7 @@ - + @@ -263,7 +263,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/tutorials/kms/celo/index.html b/ko/tutorials/kms/celo/index.html index 09eedb632..02896b914 100644 --- a/ko/tutorials/kms/celo/index.html +++ b/ko/tutorials/kms/celo/index.html @@ -8,7 +8,7 @@ - + @@ -204,7 +204,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/tutorials/kms/cosmos/index.html b/ko/tutorials/kms/cosmos/index.html index 14fc5aa1e..ca16313be 100644 --- a/ko/tutorials/kms/cosmos/index.html +++ b/ko/tutorials/kms/cosmos/index.html @@ -8,7 +8,7 @@ - + @@ -281,7 +281,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/tutorials/kms/ethereum/index.html b/ko/tutorials/kms/ethereum/index.html index 303b21f4e..f8599a7a7 100644 --- a/ko/tutorials/kms/ethereum/index.html +++ b/ko/tutorials/kms/ethereum/index.html @@ -8,7 +8,7 @@ - + @@ -199,7 +199,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/tutorials/kms/index.html b/ko/tutorials/kms/index.html index 2906fa187..2b8778143 100644 --- a/ko/tutorials/kms/index.html +++ b/ko/tutorials/kms/index.html @@ -8,14 +8,14 @@ - +

    @dsrv/kms

    November 11, 2022
    Nahee Park
    Software Engineer, DSRV

    Sign Transaction General

    정보

    @dsrv/kms 패키지를 이용해 체인별로 transaction을 전송하는 튜토리얼에 앞서, transaction 서명에 대한 개념적인 내용을 먼저 살펴보고자 합니다.

    1. 암호화 기본

    암호화는 중요한 문서를 읽기 어려운 값으로 변환하여 제 3자가 볼수 없도록 하거나, 공개된 문서의 진위여부를 가리기 위해 사용하는 기술입니다. 블록체인에서 주로 사용하는 비대칭 암호화(Asymmetric Key Cryptography)는 암호화와 복호화에 서로 다른 키들을 사용하는 방식을 뜻합니다. 이 때 서로 다른 두 개의 키들을 개인키, 공개키라고 하는데, 이것 때문에 공개키 방식(Public-key Encryption)이라고 일컫기도 합니다. 그럼 이러한 암호화 기술이 문서의 진위를 가릴 때 어떻게 사용될까요? 아래 예시를 통해 함께 봅시다. kms-tutorial

    1. Alice는 비대칭 알고리즘으로 한 쌍의 키쌍을 생성합니다.
      • Alice는 자신의 신원을 퍼블릭키를 통해 증명할 수 있습니다.
    2. Alice는 전송할 평문을 해시하여 고정 길이로 변환 합니다.
      • 평문 안에는 작성자가 누구인지 알 수 있는 항목이 포함되어 있습니다.
      • 항목의 내용은 퍼블릭키 입니다.
    3. 고정길이로 만들어진 문장의 해시를 Alice의 개인키로 서명을 합니다.
      • 이때 Alice는 문장의 시그니쳐를 얻을 수 있습니다.
    4. Alice는 서명된 메시지(시그니쳐와 평문)를 Bob에게 보내줍니다.
    5. Bob은 시그니쳐와 평문안에 들어 있는 퍼블릭키를 이용해 복호를 하면 평문의 해시값을 다시 얻을 수 있습니다.
      • 이때 Bob이 평문을 해시한 값과 복호를 통해 얻은 해시값이 같다면 Bob은 Alice가 문장을 만들었다는 것을 확신할 수 있습니다.

    이 공개키 방식의 핵심은, Alice의 개인키로만 서명된 메시지는 Alice의 퍼블릭키로만 복호화될 수 있다는 것입니다. 그렇기 때문에 다른 사람이 서명해서 메시지를 보내는 경우, Alice의 퍼블릭키로 복호화하였을 때 원문이 제대로 나오지 않게 되므로 진위여부를 판별할 수 있습니다.

    2. 트랜잭션 전송

    그럼 위에서 살펴본 진위를 가리는 비대칭 암호화 기술이 블록체인에서는 어떻게 응용될까요? 블록체인에서 암호화는 주로 트랜잭션을 보낼 때 트랜잭션의 진위여부를 가리기 위해 사용됩니다. 만약 Alice의 계좌의 돈을 Bob계좌로 전송 하기 위해 어떤 사용자가 블록체인 노드로 트랜잭션을 전송한 경우, 해당 사용자가 Alice 계좌의 정당한 소유주인지 노드는 판단할 수 있어야 합니다. 이를 좀 더 쉽게 이해하기 위해 아래 예시를 통해 함께 살펴봅시다.

    1. 어떤 사용자가 본인의 계좌에서 Bob의 계좌로 얼마의 금액을 이동한다는 내용의 트랜잭션 평문을 개인키로 서명하여 암호화합니다.
      • 해당 트랜잭션에 서명함으로써 시그니쳐를 얻을 수 있습니다.
    2. 서명된 트랜잭션을 제 3자인 노드로 보냅니다.
    3. 노드는 이제 서명된 트랜잭션의 진위여부를 판단할 것입니다.
      • 노드는 작성자가 Alice가 서명한 트랜잭션이라고 가정하고 있기 때문에 Alice의 퍼블릭키를 이용해 해당 트랜잭션을 복호합니다.
      • Alice의 퍼블릭키로 복호한 트랜잭션 원문이 원본 트랜잭션과 일치하는지 여부를 통해 트랜잭션의 진위를 파악할 수 있습니다.

    모든 블록체인들은 트랜잭션을 byteArray로 바꾸는 serialize의 표준들이 존재하며, 체인들의 sdk를 보면 트랜잭션마다 해당 serialize, deserialize 함수들을 가지고 있습니다. 트랜잭션의 serialize를 통해 얻은 byteArray가 바로 서명을 하기전의 평문이며, 여러분들의 지갑에 들어 있는 프라이빗키와 퍼블릭키들이 서명을 하기 위한 키와 자신이 소유하고 있는 블록체인의 주소입니다.

    Tutorial

    정보

    이번 튜토리얼에서 우리는 @dsrv/kms 패키지를 이용해, 체인별로 transaction 전송하는 방법을 살펴볼 예정입니다. 그 전에 아래 명령어를 통해 @dsrv/kms를 설치해주세요.

    # using npm
    npm install @dsrv/kms

    # using yarn
    yarn add @dsrv/kms

    @dsrv/kms transaction을 전송하기 위한 구체적인 과정은 체인별로 상이하지만, 대부분의 체인은 공통적인 프로세스를 따릅니다.

    1. SDK를 사용하여 각 체인에 대한 raw transaction을 만듭니다.
    2. @dsrv/kmssignTx메서드를 통해 signature를 받습니다.
    3. @dsrv/kms를 통해 생성한 signature와 앞서 생성한 raw transaction을 합쳐 signed transaction을 생성합니다.
    4. 체인별로 SDK를 통해 signed transaction을 전송합니다.

    체인별 섹션을 통해 체인별로 요청을 보내는 상세한 방식과 예제를 살펴볼 수 있습니다.

    해당 튜토리얼은 HTML, CSS 및 JavaScript에 대한 기본적인 지식을 갖추고 계신 분이 읽으시길 추천합니다.

    - + \ No newline at end of file diff --git a/ko/tutorials/kms/near/index.html b/ko/tutorials/kms/near/index.html index d3729d044..1457ca254 100644 --- a/ko/tutorials/kms/near/index.html +++ b/ko/tutorials/kms/near/index.html @@ -8,7 +8,7 @@ - + @@ -242,7 +242,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/tutorials/kms/solana/index.html b/ko/tutorials/kms/solana/index.html index 2c1408fd2..590f6740f 100644 --- a/ko/tutorials/kms/solana/index.html +++ b/ko/tutorials/kms/solana/index.html @@ -8,7 +8,7 @@ - + @@ -220,7 +220,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/tutorials/near-ecosystem/account/index.html b/ko/tutorials/near-ecosystem/account/index.html index fe4828c0c..69375f015 100644 --- a/ko/tutorials/near-ecosystem/account/index.html +++ b/ko/tutorials/near-ecosystem/account/index.html @@ -8,7 +8,7 @@ - + @@ -19,7 +19,7 @@ account_3

    Named Accounts

    Named Accounts는 우리가 흔히 아는 welldone.near, welldone.testnet 같이 Human-Readable한 계정을 말합니다. 또한 Named Accounts는 sub-accounts를 만들 수 있는데, 예를들어 메인넷의 Named Accounts은 모두 near의 sub-accounts이고(e.g. welldone.near) 테스트넷의 Named Accounts는 모두 testnet의 sub-accounts (e.g. welldone.testnet) 로 이루어져 있습니다. 그렇다면 near, testnet, aurora 는 어떻게 만들 수 있을까요?

    기본적으로 NEAR의 Account ID는 길이가 2~64인 character로 이루어져 있는데, 그 중 길이가 64이고 소문자 hex character로 이루어져 있는 계정은 Implicit account로 간주됩니다.

    near, testnet 같은 계정은 top-level accounts (TLA) 라고 부르며 그 중에서도 near , testnet처럼 길이가 32보다 짧은 short top-level accounts 는 오직 Account ID가 registrar인 계정만 만들 수 있습니다. 길이가 32보다 긴 long top-level accounts는 누구나 생성할 수 있습니다.

    그 후에는 near 계정만이 welldone.near 를 만들 수 있고, welldone.near 만이 first.welldone.near 를 만들 수 있습니다. 이때 상위 계정은 하위 계정을 생성할 수는 있지만 access key는 공유하지 않기 때문에 제어할 권한은 없습니다.

    Implicit Accounts는 다른 account를 사용하지 않고도 생성할 수 있지만, Named Accounts는 기존에 존재하는 다른 account를 사용해야만 생성할 수 있습니다. 메인넷에서 계정을 생성하기 위해서는 near 계정에 배포된 스마트 컨트랙트에 create_account 메소드를 요청해야하고, 테스트넷에서 계정을 생성하기 위해서는 testnet 계정에 배포된 스마트 컨트렉트에 create_account 메소드를 요청해야 합니다.

    near call testnet create_account '{"new_account_id": "<account-name>.testnet", "new_public_key": "ed25519:<data>"}' --deposit 0.00182 --accountId <account-with-funds>

    이때, account-name은 기존에 존재하는 아이디와 중복되지 않아야 하고 new_public_key의 인자로 전달하는 퍼블릭 키가 생성하는 계정의 Full Access Key가 됩니다. 앞선 실습에서 만들었던 Implicit Accounts의 퍼블릭 키를 이용해서 Named Accounts를 생성해보도록 하겠습니다.

    account_4 account_5 account_6

    Named Accounts가 성공적으로 만들어져서 익스플로러에서 검색이 되는 것을 확인할 수 있고, new_public_key의 인자로 전달한 값이 Full Access Key로 추가된 것도 확인할 수 있습니다.

    Permissions Through Access Keys

    블록체인에서 Account를 사용한다는 것은 트랜잭션을 서명할 때 Account의 프라이빗 키를 사용한다는 뜻입니다. NEAR의 Account는 여러 개의 Access Key (퍼블릭 키 - 프라이빗 키 페어) 를 가질 수 있고 각각의 Access Key가 Account에 대한 권한을 갖고 있습니다. Access Key는 Account에 속하며 account_id, public_key 형태로 저장됩니다. 이는 Account에 대한 권한을 요구하는 third-parties에게 제한적인 권한을 주고 언제든지 권한을 삭제할 수 있다는 장점이 있습니다. 한 계정은 여러 Access Key를 가질 수 있고, 하나의 Access Key 또한 여러 개의 계정에 추가될 수 있습니다.

    Full Access Keys

    NEAR의 Access Key는 Full Access Key와 Function Call Key 두 가지 종류가 있습니다. Full Access Key는 말 그대로 어떠한 액션을 하는 트랜잭션도 서명할 수 있고, 다른 Access Key를 Account에 추가하거나 삭제하고 Account 자체를 삭제할 수 있는 권한도 가집니다. 계정을 처음 생성할 때 첫번째 Full Access Key를 추가하게 됩니다.

    앞서 만들었던 계정에 Full Access Key를 추가하고 싶다면 near-cli를 이용해서 다음의 명령어로 간단하게 추가할 수 있습니다.

    near add-key {account_id} {public_key}
    WELLDONESTUDIO’s Tip

    Account에 저장되어 있는 Access Key가 궁금하다면 다음의 명령어를 통해 확인할 수 있습니다.

    near keys {account_id}

    near-cli의 기본 네트워크는 testnet으로 지정되어 있으므로 mainnet에서 검색하기를 원하는 경우 다음의 환경변수를 지정해줍니다.

    export NEAR_ENV=mainnet

    Function Call Keys

    Function Call Key는 컨트랙트의 non-payable 메소드를 호출할 수 있는 권한을 가집니다. non-payable 메소드란 NEAR 토큰을 deposit으로 갖고 있지 않은 함수를 뜻합니다. Function Call Key는 호출을 허용할 메소드의 종류를 지정할 수 있는데, 아무것도 지정하지 않은 경우 모든 non-payable 메소드를 허용합니다.

    Function Call Key를 추가하는 near-cli 명령어는 다음과 같습니다.

    near add-key {account_id} {public_key} --contract-id {contract_id} --method-names {method_name} --allowance {allowance}

    필수로 전달해야 하는 인자는 account_id, public_key, contract_id이고 method_name은 생략할 경우 모든 non-payable 메소드를 호출하는 권한을 허용합니다. allowance는 해당 Access Key를 사용했을 때 지불 가능한 balance limit을 지정합니다. 즉 Access Key를 사용해서 메소드를 호출해서 gas fee를 지불할 때마다 Account의 balance와 Access Key의 allowance가 함께 줄어듭니다. None을 인자로 전달해서 제한을 두지 않을 수도 있고, 값을 생략한 경우에는 gas fee가 들지 않는 view methods만 호출이 가능합니다.

    대부분 NEAR의 dApp 에서는 Function Call Key를 생성해서 유저에게 권한을 요청합니다. 그래서 non-payable 함수를 사용할 경우에는 사용자의 추가 인터랙션 없이 진행이 가능하고, 토큰 전송을 원한다면 다시 한 번 사용자에게 승인을 요청해야 합니다.

    Simple to Develop Smart Contracts

    NEAR에서 스마트 컨트랙트를 배포하기 위해서는 Account가 필요합니다. Account 당 하나의 스마트 컨트랙트만 배포하고 활성화할 수 있으며, 스마트 컨트랙트는 Account의 State에 저장됩니다. 컨트랙트는 자체적인 storage를 따로 가지고 Account의 이름으로 트랜잭션을 실행할 수도 있습니다.

    스마트 컨트랙트는 WebAssembly로 컴파일되어야 하는데, 현재 near-sdk와 연동되는 언어로 Rust, Javascript, AssemblyScrtip를 지원하고 있습니다. NEAR의 컨트랙트에 대한 자세한 설명은 다음 튜토리얼에서 다루도록 하겠습니다.

    Mutable State (Storage)

    NEAR의 Account는 메타데이터와 배포된 컨트랙트와 관련된 데이터(컨트랙트의 코드 + storage)가 저장되어 있는 상태(State)를 가집니다. Account의 State는 누구나 읽을 수 있지만 오직 Account 자신만 변경할 수 있습니다. 또한 각각의 Account는 자신이 사용한 storage의 비용을 지불하기 위해 balance의 일부분을 lock 해야 합니다.

    Account’s Metadata

    Account의 State는 메타데이터를 저장합니다. near-cli 로 앞서 생성한 Account의 State를 확인해보세요.

    near state {account_id}

    account_7

    • amount: yoctoNEAR 단위로 표현한 Account의 balance (1 Ⓝ = 10^24yⓃ).
    • code_hash: Account에 배포된 컨트랙트 와즘 파일의 해시. 만약 컨트랙트가 배포되어있지 않다면 1s로 채워집니다. 위의 예시의 경우에도 컨트랙트가 배포되어 있지 않기 때문에 code_hash 값이 1로 채워져 있는 것을 확인할 수 있습니다.
    • storage_usage: Account가 사용하는 Storage의 bytes 크기. (code + metadata + data storage)

    Contract’s State

    Account의 State는 컨트랙트의 코드와 컨트랙트의 storage가 저장되는 공간이기도 합니다. 컨트랙트의 storage는 base64와 JSON serialization으로 인코딩 된 key-value 페어로 이루어져 있습니다.

    Account의 컨트랙트의 state는 다음 명령어를 이용해서 확인할 수 있습니다.

    near view-state {account_id} --finality final --utf8 true

    만약 Account에 스마트 컨트랙트가 배포되어 있지 않다면 빈 배열이 리턴될 것이고, 컨트랙트가 배포되어 있다면 아래처럼 컨트랙트에 저장된 값이 key-value 페어로 반환될 것입니다.

    account_8

    Paying for Storage

    Account는 사용하는 storage에 대한 비용을 지불하기 위해서, Account의 잔액 중 일부를 데이터가 저장된 양에 비례하여 lock 해야합니다. 만약 더 많은 데이터가 추가되어 state가 증가하면 Account의 잔액은 줄어들 것이고, 데이터가 삭제되어서 state가 감소하면 Account의 잔액은 늘어날 것입니다.

    현재 (2022.10.17 NEAR Docs 기준) 데이터 100kb를 저장하기 위해서는 약 1 Ⓝ가 필요합니다.

    Wrap-Up

    이번 튜토리얼에서는 NEAR 생태계에서 Account 가 어떻게 구성되어 있는지, 그 특징을 알아보고 직접 near-cli를 이용해서 Account를 만들어보는 실습을 진행했습니다. NEAR Account의 특징은

    1. human-readable 한 Account ID를 갖는다.
    2. Access Key를 여러개 가질 수 있어 권한 관리가 유연하다.
    3. 스마트 컨트랙트를 배포할 수 있다
    4. 컨트랙트의 메타데이터와 코드, storage를 저장하는 State를 가진다

    위와 같은 네 가지로 크게 정리할 수 있습니다. 이번 튜토리얼이 NEAR의 Account 모델에 궁금증을 가지셨던 분들께 도움이 되었길 바라면서 다음에는 NEAR의 컨트랙트에 대한 튜토리얼과 함께 돌아오도록 하겠습니다.


    Reference

    https://docs.near.org/concepts/basics/accounts/model

    https://nomicon.io/DataStructures/Account

    https://docs.near.org/integrator/implicit-accounts

    - + \ No newline at end of file diff --git a/ko/tutorials/near-ecosystem/index.html b/ko/tutorials/near-ecosystem/index.html index 13ca1ba1f..826bea631 100644 --- a/ko/tutorials/near-ecosystem/index.html +++ b/ko/tutorials/near-ecosystem/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/tutorials/near-ecosystem/migrate-contract/index.html b/ko/tutorials/near-ecosystem/migrate-contract/index.html index fbd68832c..7d0b373e2 100644 --- a/ko/tutorials/near-ecosystem/migrate-contract/index.html +++ b/ko/tutorials/near-ecosystem/migrate-contract/index.html @@ -8,13 +8,13 @@ - +

    How to Migrate the Contract

    January 3, 2023
    Suji Yoon
    Software Engineer, DSRV

    Introduction

    NEAR의 스마트 컨트랙트는 Account의 state에 저장됩니다. 앞선 Account Model 튜토리얼에서 Account 당 하나의 계정만 배포하고 활성화할 수 있다고 설명했는데요. 만약 이미 배포한 컨트랙트를 업데이트하고 싶은 경우에는 어떻게 해야 할까요? 이번 튜토리얼에서는 이미 배포한 스마트 컨트랙트를 업데이트하는 다양한 방법을 살펴보고, WELLDONE Code를 사용해서 컨트랙트 Migration을 직접 실습해보는 시간을 갖도록 하겠습니다.

    Updating Contracts

    스마트 컨트랙트를 개발하는 단계나 심지어 운영 중인 단계에서도 컨트랙트를 수정해야하는 상황이 생길 수 있습니다. 로컬에서 개발중인 상황이라면 단순하게 수정된 컨트랙트를 새로운 Account에 배포하는 것으로 해결할 수 있지만, 이전에 배포된 컨트랙트의 데이터를 그대로 사용할 수 없다는 단점이 있습니다. 따라서 이전에 배포한 컨트랙트의 데이터를 유지하고 싶거나 이미 메인넷에 컨트랙트를 배포하여 서비스를 운영 중이라면 기존의 Account에 배포된 컨트랙트를 Migration 하는 방법을 사용해야 합니다.

    그럼 이제 컨트랙트를 업데이트하는 세 가지 방법을 알아보겠습니다.

    Re-deploy another contract

    이전에 배포된 컨트랙트의 상태를 그대로 유지할 필요가 없는 경우라면, 간단하게 컨트랙트를 새로운 계정에 다시 배포하는 방법으로 컨트랙트를 업데이트할 수 있습니다. 테스트넷이라면 NEAR CLI의 dev-deploy 명령어를 이용해서 손쉽게 새로운 dev-account를 생성해서 컨트랙트를 배포할 수 있고, 이전에 사용한 Account ID를 그대로 사용하고 싶다면 해당 Account를 삭제한 후 다시 동일한 이름의 Account를 만들어서 컨트랙트를 배포할 수 있습니다. Account가 삭제될 때 이미 기존에 배포된 컨트랙트의 데이터도 함께 삭제되기 때문에 새로운 계정을 생성하여 컨트랙트를 배포한 경우와 동일한 효과를 얻을 수 있습니다.

    dev-account에 컨트랙트를 배포하기 위해서는 NEAR CLI를 설치해야 합니다.

    near dev-deploy --wasmFile [wasm 파일 경로]

    위의 명령어를 실행하면 dev- 로 시작하는 새로운 테스트넷 Account가 자동으로 생성되며 해당 Account에 컨트랙트를 배포합니다. 생성된 dev-account의 정보는 현재 위치의 neardev 폴더 안에 저장되며 프라이빗 키는 ~/.near-credentials 폴더 안에 저장됩니다.

    dev-deploy 명령어는 neardev 폴더가 존재하는 경우에는 새로 계정을 생성하지 않고 기존에 만들었던 dev-account에 컨트랙트를 배포하기 때문에 컨트랙트를 수정한 이후 다시 새로운 dev-account를 생성하여 컨트랙트를 재배포하고 싶다면 neardev 폴더를 삭제하고 위의 명령어를 다시 실행해야 합니다.

    다음으로 기존에 존재하는 Account를 삭제하고 동일한 이름의 Account를 재생성하여 컨트랙트를 배포하는 방법을 알아보겠습니다. 이 방법 역시 NEAR CLI를 이용하여 진행합니다. app-name.you.testnet 이라는 sub-account 에 기존의 컨트랙트가 배포되어 있고, 동일한 계정에 재배포를 진행한다고 가정해보겠습니다.

    먼저 기존에 컨트랙트가 배포된 app-name.you.testnet 을 삭제합니다. 이때 Account를 삭제하기 위해서는 삭제하려는 Account의 Full Access Key를 가지고 있어야 한다는 점을 유의해주세요.

    near delete app-name.you.testnet you.testnet

    위의 명령어를 실행하면 app-name.you.testnet 이 삭제되고 Account에 남아 있던 토큰은 you.testnet에게 전송되며, 해당 Account에 배포된 컨트랙트의 데이터도 함께 삭제됩니다.

    그리고 동일한 이름의 sub-account를 다시 생성하고, 해당 계정에 수정된 컨트랙트를 배포합니다.

    near create-account app-name.you.testnet --masterAccount you.testnet
    near deploy --accountId app-name.you.testnet --wasmFile [wasm 파일 경로]

    이와 같이 Account를 삭제하고 재생성하여 컨트랙트를 배포하면 이전의 컨트랙트 데이터가 모두 삭제된 상태이기 때문에 컨트랙트를 처음 배포하는 것 같은 효과를 얻을 수 있습니다.

    Migrating the State

    이전에 배포한 컨트랙트의 데이터를 유지하면서 동일한 Account에 스마트 컨트랙트를 재배포하고 싶다면, 컨트랙트의 상태(state)를 Migration 하는 메소드가 필요합니다.

    왜 단순히 기존의 컨트랙트가 배포된 Account에 업데이트된 컨트랙트를 그대로 재배포하면 안되는 걸까요? NEAR의 스마트 컨트랙트는 컨트랙트의 코드(logic)와 상태(storage)가 분리되어 Account의 state에 저장되기 때문에 Account에 컨트랙트를 재배포하면 컨트랙트의 코드는 변경되지만 state는 그대로 유지됩니다.

    컨트랙트가 실행될 때 NEAR 런타임은 디스크에서 직렬화된 상태를 읽고 현재 컨트랙트 코드를 사용하여 로드를 시도합니다. 이때, 만약 코드가 기존에 배포된 컨트랙트와 다른 상태를 가지고 있다면 컨트랙트를 실행할 때 Cannot deserialize the contract state 라는 에러가 발생합니다. 따라서 컨트랙트의 상태를 수정한 경우에는 새롭게 수정된 컨트랙트의 코드로 기존 컨트랙트의 상태를 읽어올 수 있도록 하는 Migration 메소드가 필요한 것입니다.

    Migration 메소드는 다음의 기능을 수행합니다.

    1. 컨트랙트의 현재 상태를 읽는다.
    2. 현재 상태를 Migration할 새로운 상태로 변환한다.
    3. 새로운 상태를 반환한다.

    WELLDONE Code를 활용한 실습 파트에서 Migration 메소드를 사용한 예제를 통해 더 자세히 알아보도록 하겠습니다.

    Programmatic Update

    스마트 컨트랙트 자기 자신이 스스로 컨트랙트를 업데이트할 수 있는 메소드를 작성하는 방법이 있습니다. 보통 스마트 컨트랙트 코드 안에 해당 메소드를 구현해서 배포를 한 후, 스마트 컨트랙트가 배포된 Account의 Full Access Key를 모두 삭제하는 방식으로 사용합니다. 이는 개발자를 포함한 외부의 그 누구도 스마트 컨트랙트를 수정하지 못한다는 것을 확실하게 보여 줄 수 있습니다. 이와 같이 Account의 모든 Full Access Key가 사라진 상태를 locked 상태라고 합니다. 오직 스마트 컨트랙트 자기 자신만이 컨트랙트를 업데이트할 수 있습니다.

    이 방법은 컨트랙트 업데이트 과정이 모든 dApp 사용자에게 투명하게 공개되기 때문에, 사용자의 동의 없는 악의적인 업데이트가 일어나지 않도록 보장합니다.

    스마트 컨트랙트 스스로 컨트랙트를 업데이트하는 메소드는 다음의 기능을 수행합니다.

    1. 재배포하고자하는 컨트랙트의 wasm 값을 인풋으로 받는다.
    2. 스스로 컨트랙트를 배포하는 Promise 를 생성한다.
    pub fn update_contract(&self) -> Promise {
    // Check the caller is authorized to update the code
    assert!(env::predecessor_account_id() == self.manager, "Only the manager can update the code");

    // Receive the code directly from the input to avoid the
    // GAS overhead of deserializing parameters
    let code = env::input().expect("Error: No input").to_vec();

    // Deploy the contract on self
    Promise::new(env::current_account_id())
    .deploy_contract(code)
    .function_call(
    "migrate".to_string(),
    NO_ARGS,
    0,
    CALL_GAS
    )
    .as_return()
    }

    전체 예시 코드는 다음 링크에서 확인할 수 있습니다. JavaScript로 작성된 예시 코드는 다음 링크에서 확인할 수 있습니다.

    Get your Hands Dirty on WELLDONE Code

    그럼 이제 WELLDONE Code 에서 실제로 Rust로 작성한 스마트 컨트랙트를 Migration 메소드를 사용하여 업데이트하는 방법을 실습해보도록 하겠습니다.

    Prerequisites
    • Docs의 매뉴얼을 참고하여 WELLDONE Wallet에서 NEAR 테스트넷 계정을 생성해주세요. 일정량의 NEAR 테스트넷 토큰이 필요합니다.
    • 해당 파트의 목적은 컨트랙트 Migration을 직접 실습해보는 것입니다. WELLDONE Code의 기본적인 연결 및 사용 방법은 Code Docs 혹은 dApp 개발 튜토리얼을 참고해주세요.

    먼저 우리가 사용할 컨트랙트를 간단하게 살펴보겠습니다. 해당 컨트랙트는 GuestBook 이라는 컨트랙트로 PostedMessage라는 구조체의 벡터 배열과, Balance의 벡터 배열을 상태(state)로 저장하고 있습니다. 메소드로는 메시지를 추가하는 add_message와 저장하고 있는 messages를 읽어오는 get_message, payments를 읽어오는 get_payments 를 가지고 있습니다. 컨트랙트의 전체 코드는 다음 레포지토리에서 확인하실 수 있습니다.

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize, Serialize)]
    #[serde(crate = "near_sdk::serde")]
    pub struct PostedMessage {
    pub premium: bool,
    pub sender: AccountId,
    pub text: String,
    }

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize)]
    pub struct GuestBook {
    messages: Vector<PostedMessage>,
    payments: Vector<Balance>,
    }

    Deploy the Contract

    그럼 이제 WELLDONE Code로 이동해서 GuestBook 컨트랙트를 먼저 배포해보겠습니다.

    1. WELLDONE Code의 NEAR 섹션으로 들어가 WELLDONE Wallet과 연결합니다.

      이때 연결된 계정이 우리가 컨트랙트를 배포할 계정이 되어야 합니다. 이전에 컨트랙트를 배포한 적이 없는 새로운 계정을 만들어 연결해주세요.

      contract_1
    2. Project 섹션에서 Rust 옵션을 선택한 후, 생성할 프로젝트의 이름을 입력하고 New Project 버튼을 클릭합니다.

      contract_2

      File Explorer로 돌아오면 near라는 폴더 안에 동일한 이름의 프로젝트 구조가 생성되어 있을 것입니다.

      contract_3
    3. 배포할 컨트랙트의 내용을 붙여넣습니다.

      • Cargo.toml
      [package]
      name = "guestbook"
      version = "1.0.0"
      authors = ["Near Inc <hello@near.org>"]
      edition = "2021"

      [lib]
      crate-type = ["cdylib"]

      [dependencies]
      near-sdk = "4.0.0"
      uint = { version = "0.9.3", default-features = false }
      • src/lib.rs
      use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
      use near_sdk::collections::Vector;
      use near_sdk::json_types::U128;
      use near_sdk::serde::Serialize;
      use near_sdk::{env, near_bindgen, AccountId, Balance};

      const POINT_ONE: Balance = 100_000_000_000_000_000_000_000;

      #[near_bindgen]
      #[derive(BorshDeserialize, BorshSerialize, Serialize)]
      #[serde(crate = "near_sdk::serde")]
      pub struct PostedMessage {
      pub premium: bool,
      pub sender: AccountId,
      pub text: String,
      }

      #[near_bindgen]
      #[derive(BorshDeserialize, BorshSerialize)]
      pub struct GuestBook {
      messages: Vector<PostedMessage>,
      payments: Vector<Balance>,
      }

      impl Default for GuestBook {
      fn default() -> Self {
      Self {
      messages: Vector::new(b"m"),
      payments: Vector::new(b"p"),
      }
      }
      }

      #[near_bindgen]
      impl GuestBook {
      #[payable]
      pub fn add_message(&mut self, text: String) {
      let payment = env::attached_deposit();
      let premium = payment >= POINT_ONE;
      let sender = env::predecessor_account_id();

      let message = PostedMessage {
      premium,
      sender,
      text,
      };
      self.messages.push(&message);
      self.payments.push(&payment);
      }

      pub fn get_messages(&self, from_index: Option<U128>, limit: Option<u64>) -> Vec<PostedMessage> {
      let from = u128::from(from_index.unwrap_or(U128(0)));

      self.messages
      .iter()
      .skip(from as usize)
      .take(limit.unwrap_or(10) as usize)
      .collect()
      }

      pub fn get_payments(&self, from_index: Option<U128>, limit: Option<u64>) -> Vec<U128> {
      let from = u128::from(from_index.unwrap_or(U128(0)));

      self.payments
      .iter()
      .skip(from as usize)
      .take(limit.unwrap_or(10) as usize)
      .map(|x| U128(x))
      .collect()
      }
      }
    4. 컨트랙트를 컴파일합니다.

      컴파일 옵션으로 Rust를 선택한 후 Compile 버튼을 클릭합니다. 컴파일이 완료되면 wasm 파일이 반환됩니다.

      contract_4
    5. 컨트랙트를 배포합니다.

      컴파일이 완료되면, 자동으로 밑에 Deploy 섹션이 나타납니다. 컨트랙트를 배포할 계정의 ID를 입력한 후 Deploy 버튼을 눌러 컨트랙트를 배포합니다. 이때, WELLDONE Wallet과의 인터랙션이 필요합니다.

      contract_5
    6. 컨트랙트 실행하기

      컨트랙트 배포가 완료되면 배포된 컨트랙트를 자동으로 가져와 보여줍니다. add_messages 메소드를 실행하여 컨트랙트가 잘 배포되었는지 확인합니다. text 필드에 전달하는 값이 메시지가 되고, deposit 으로 전달하는 토큰량이 payments가 됩니다. add_messages는 call 메소드이기 때문에 Call 버튼을 클릭하여 트랜잭션을 전송합니다.

      contract_6

      트랜잭션이 성공하면, get_messagesget_payments 메소드를 View 버튼을 클릭하여 실행하면 앞서 추가한 메시지와 payments 값을 반환하는 것을 확인할 수 있습니다.

      contract_7

      contract_8

    Writing a Migration Method

    우리가 배포한 컨트랙트의 state를 아래와 같이 변경하고 싶다고 가정해봅시다. 이전에는 paymentsGuestBook 안에서 저장했다면, 변경 후에는 PostedMessage 안에서 payments를 함께 관리할 것입니다. 이와 같이 스마트 컨트랙트의 상태가 변경된 경우, 동일한 계정에 컨트랙트를 재배포하면 Cannot deserialize the contract state 에러가 발생한다는 것을 우리는 알고 있습니다.

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize, Serialize)]
    #[serde(crate = "near_sdk::serde")]
    pub struct PostedMessage {
    pub payment: u128,
    pub premium: bool,
    pub sender: AccountId,
    pub text: String,
    }

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize)]
    pub struct GuestBook {
    messages: Vector<PostedMessage>,
    }

    이를 해결하기 위해, 우리는 변경된 컨트랙트에 Migration 메소드를 추가해야 합니다.

    앞서 Migration 메소드는 다음의 기능을 수행한다고 했습니다.

    1. 컨트랙트의 현재 상태를 읽는다.
    2. 현재 상태를 Migration할 새로운 상태로 변환한다.
    3. 새로운 상태를 반환한다.

    즉, 이전의 GuestBook 에 저장되어 있던 값을 순환하여 읽어온 후, 새로운 PostedMessage 형식(payment, premium, sender, text) 에 맞춰 변환시키는 메소드를 작성해야 합니다.

    src/migrate.rs 라는 새로운 파일을 생성해서 아래의 내용을 붙여넣어 주세요.

    use crate::*;

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize, Serialize)]
    #[serde(crate = "near_sdk::serde")]
    pub struct OldPostedMessage {
    pub premium: bool,
    pub sender: AccountId,
    pub text: String,
    }

    #[derive(BorshDeserialize, BorshSerialize)]
    pub struct OldState {
    messages: Vector<OldPostedMessage>,
    payments: Vector<Balance>,
    }

    #[near_bindgen]
    impl GuestBook {
    #[private]
    #[init(ignore_state)]
    pub fn migrate() -> Self {
    // retrieve the current state from the contract
    let old_state: OldState = env::state_read().expect("failed");

    // iterate through the state migrating it to the new version
    let mut new_messages: Vector<PostedMessage> = Vector::new(b"p");

    for (idx, posted) in old_state.messages.iter().enumerate() {
    let payment = old_state.payments.get(idx as u64).unwrap_or(0);

    new_messages.push(&PostedMessage {
    payment,
    premium: posted.premium,
    sender: posted.sender,
    text: posted.text,
    })
    }

    // return the new state
    Self {
    messages: new_messages,
    }
    }
    }

    src/lib.rs 에도 아래와 같이 업데이트된 버전의 컨트랙트로 수정해주세요.

    use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
    use near_sdk::collections::Vector;
    use near_sdk::json_types::U128;
    use near_sdk::serde::Serialize;
    use near_sdk::{env, near_bindgen, AccountId, Balance};

    mod migrate;

    const POINT_ONE: Balance = 100_000_000_000_000_000_000_000;

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize, Serialize)]
    #[serde(crate = "near_sdk::serde")]
    pub struct PostedMessage {
    pub payment: u128,
    pub premium: bool,
    pub sender: AccountId,
    pub text: String,
    }

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize)]
    pub struct GuestBook {
    messages: Vector<PostedMessage>,
    }

    impl Default for GuestBook {
    fn default() -> Self {
    Self {
    messages: Vector::new(b"m"),
    }
    }
    }

    #[near_bindgen]
    impl GuestBook {
    #[payable]
    pub fn add_message(&mut self, text: String) {
    let payment = env::attached_deposit();
    let sender = env::predecessor_account_id();
    let premium = payment >= POINT_ONE;
    let message = PostedMessage {
    payment,
    sender,
    premium,
    text,
    };
    self.messages.push(&message);
    }

    pub fn get_messages(&self, from_index: Option<U128>, limit: Option<u64>) -> Vec<PostedMessage> {
    let from = u128::from(from_index.unwrap_or(U128(0)));

    self.messages
    .iter()
    .skip(from as usize)
    .take(limit.unwrap_or(10) as usize)
    .collect()
    }
    }

    여기서 우리는 migration 메소드가 initialization 메소드라는 것에 주목해야 합니다. 컨트랙트의 다른 메소드를 실행하기 전에 가장 먼저 실행되어야 하는 메소드이며, 딱 한 번만 실행하는 메소드입니다. 만약 컨트랙트를 재배포한 후 migration 메소드를 실행하기 전에 다른 메소드를 실행하면 Cannot deserialize the contract state 에러가 동일하게 발생할 것입니다.

    Re-Deploy the Contract

    그럼 이제 업데이트한 컨트랙트를 동일한 계정에 다시 배포해보겠습니다.

    1. 수정한 컨트랙트를 다시 컴파일합니다.

      프로젝트의 out 폴더를 삭제한 후 Compile 버튼을 클릭합니다. out 폴더를 삭제하지 않는다면 If you want to run a new compilation, delete the 'out' directory and click the Compile button again. 라는 에러 로그가 터미널에 출력될 것입니다.

    2. Init function 으로 migration 메소드를 지정하여 재배포를 진행합니다.

      이때, 계정에 이미 배포된 컨트랙트가 있기 때문에 사용자에게 한 번 더 의사를 묻는 모달창이 나타납니다. YES 버튼을 눌러 배포를 진행해주세요.

      contract_9contract_10
    3. 컨트랙트 실행하기

      컨트랙트 배포가 완료되면 배포된 컨트랙트를 자동으로 가져와 보여줍니다. get_messages 메소드를 실행시켜보면, 이전에 저장되어있던 정보가 새롭게 업데이트된 구조로 잘 변환되어 출력하는 것을 확인할 수 있습니다.

      contract_11

    Wrap-Up

    이번 튜토리얼에서는 NEAR에서 이미 계정에 배포한 컨트랙트를 업데이트하는 방법을 알아보고, WELLDONE Code를 사용해서 직접 Migration 메소드를 작성해보는 실습을 진행했습니다.

    이미 계정에 배포한 컨트랙트를 업데이트 하는 방법은 크게 다음과 같이 정리할 수 있습니다.

    1. 새로운 Account에 배포하기
    2. Migration 메소드 사용하기
    3. Programmatic Update 사용하기

    이 튜토리얼이 NEAR의 컨트랙트를 유지 및 보수하는 방법에 대해 궁금증을 가지셨던 분들께 도움이 되었길 바랍니다.


    Reference

    https://docs.near.org/develop/upgrade

    https://docs.near.org/concepts/web3/near#contract-upgrades

    https://docs.near.org/develop/contracts/serialization#deserialization-error

    - + \ No newline at end of file diff --git a/ko/tutorials/near/index.html b/ko/tutorials/near/index.html index d9288f039..990ec8ec4 100644 --- a/ko/tutorials/near/index.html +++ b/ko/tutorials/near/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/tutorials/near/rust/index.html b/ko/tutorials/near/rust/index.html index a114b4a61..2b9ad00d1 100644 --- a/ko/tutorials/near/rust/index.html +++ b/ko/tutorials/near/rust/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/tutorials/near/rust/near-contract/index.html b/ko/tutorials/near/rust/near-contract/index.html index c988cd071..511833e14 100644 --- a/ko/tutorials/near/rust/near-contract/index.html +++ b/ko/tutorials/near/rust/near-contract/index.html @@ -8,7 +8,7 @@ - + @@ -20,7 +20,7 @@ 1_13

    노트

    WELLDONE Code를 통해 NEAR 에서 컨트랙트를 컴파일 및 배포하기 위해서는 near/ 폴더 내부에 컨트랙트를 작성해야 합니다. 언어 별로 더 자세한 구조는 Code 문서를 참고해주세요.

    카운터 컨트랙트 톺아보기

    이제 rs_counter 폴더 안의 src/lib.rs 파일에서 컨트랙트 코드를 함께 보면서 NEAR에서 Rust로 스마트 컨트랙트를 어떻게 작성하는 지 살펴보겠습니다.

    src/lib.rs 코드의 제일 상단에서는 /Cargo.toml 파일에 선언된 near_sdk 에 접근해서 스마트 컨트랙트 작성에 필요한 모듈을 import 했습니다.

    use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
    use near_sdk::{log, near_bindgen};
    • self : BorshDeseiralizeBorshSerialize가 작동하기 위해 필요합니다. 스마트 컨트랙트 자기 자신을 참조합니다.
    • BorshDeserialize : 스마트 컨트랙트의 함수를 호출하면서 인자를 함께 전달할 때, JSON 타입의 인자를 역직렬화합니다.
    • BorshSerialize : 스마트 컨트랙트에서 결과를 다시 보낼 때 JSON으로 직렬화합니다.
    • near_bindgen : 스마트 컨트랙트라는 것을 알려주는 어노테이션으로 각 컨트랙트마다 near_bindgen 어노테이션과 함께 선언된 struct가 적어도 하나씩은 있어야 합니다.
    WELLDONE Studio’s Tip : What is Borsh?

    Rust를 주로 다뤄보셨던 분들은 Serde라는 데이터 직렬화 및 역직렬화 프레임워크에 익숙하실 것 같습니다. 하지만 NEAR는 Borsh라는 별도의 Rust용 프레임워크를 만들었습니다. Borsh는 Serde보다 속도와 안정성 측면에서 우수하다고 주장합니다.

    다음으로 struct를 선언합니다. struct 선언자 위의 attributes 들은 WebAssembly로 컴파일된 파일이 NEAR 블록체인에서 호환될 수 있도록 해줍니다. Default는 컨트랙트의 기본 생성자로, 컨트랙트를 배포한 후 함수를 실행하려 할 때 함수 실행 전에 NEAR의 가상머신이 기본값으로 컨트랙트를 초기화합니다.

    아래 코드의 경우 vali8 타입이기 때문에 기본값인 0으로 초기화가 될 것입니다. pub 는 스마트 컨트랙트가 public 하게 접근 가능하다는 것을 의미합니다.

    #[near_bindgen]
    #[derive(Default, BorshDeserialize, BorshSerialize)]
    pub struct Counter {
    val: i8,
    }

    만약 기본값이 아닌 다른 값으로 컨트랙트를 초기화하고 싶다면 아래와 같이 구현할 수 있습니다.

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize)]
    pub struct Counter {
    val: i8,
    }

    impl Default for Counter{
    fn default() -> Self {
    Counter {val: 8}
    }
    }

    이제 impl을 사용해서 컨트랙트의 실제 함수들을 구현할 것입니다. NEAR의 스마트 컨트랙트 내부에 속하는 함수라는 사실을 명시하기 위해, 앞서 Struct에서 보았던 것처럼 near_bindgen 어노테이션을 추가해 줍니다.

    #[near_bindgen]
    impl Counter {
    // ...
    }

    Rust에서 스마트 컨트랙트를 작성할 때는 이렇게 struct와 실제 함수를 구현하는 impl 을 가지는 패턴으로 작성하는 것이 일반적입니다. 함수를 더 자세히 들여다보도록 하겠습니다.

    카운터 컨트랙트에는 get_num, increment, decrement, reset 네 가지 함수가 구현되어 있습니다. 먼저 get_num 함수 코드는 다음과 같습니다.

    인자로 전달하는 &selfstruct의 인스턴스를 참조하고, i8 타입의 카운터 값을 반환하는 함수이기 때문에 리턴 타입을 명시해줍니다.

    pub fn get_num(&self) -> i8 {
    return self.val;
    }

    다음으로 storage의 카운터 값에 1을 더해주는 increment 함수와 1을 빼주는 decrement 함수를 살펴보겠습니다. get_num 과는 다르게 increment, decrement 함수는 컨트랙트 내부의 값을 변경합니다. &mutmutable이라는 뜻으로 &mut selfself 변수에 대한 mutable한 참조를 생성합니다.

    pub fn increment(&mut self) {
    self.val += 1;
    log!("Increased number to {}", self.val);
    }

    pub fn decrement(&mut self) {
    self.val -= 1;
    log!("Decreased number to {}", self.val);
    }

    마지막으로 컨트랙트의 카운터 값을 0으로 초기화하는 reset 함수입니다. increment, decrement 함수와 마찬가지로 컨트랙트 내부의 값을 변경하기 때문에 &mut self 를 이용합니다.

    pub fn reset(&mut self) {
    self.val = 0;
    log!("Reset counter to zero");
    }

    이렇게 스마트 컨트랙트 코드를 모두 살펴보았는데요. 다음으로 테스트 코드를 살펴보도록 하겠습니다.

    mod tests 는 말 그대로 tests 라는 이름의 모듈을 의미합니다. cfg는 괄호 안의 조건이 true인 경우에만 모듈을 컴파일하라는 컴파일 명령어입니다. 아래의 경우에는 cargo test 명령을 실행할 때만 (test) 조건이 true가 되기 때문에 테스트를 실행하지 않으면 해당 모듈은 컴파일되지 않습니다.

    #[cfg(test)]
    mod tests {

    테스트 코드는 총 5개로 increment, decrement 함수의 경우에는 먼저 counter 값을 0으로 초기화한 Counter 인스턴스를 생성한 후, incrementdecrement를 각각 실행하고 다시 get_num으로 값을 가져와서 값이 잘 변경되었는지 확인합니다.

    #[test]
    fn increment() {
    // instantiate a contract variable with the counter at zero
    let mut contract = Counter { val: 0 };
    contract.increment();
    assert_eq!(1, contract.get_num());
    }

    #[test]
    fn decrement() {
    let mut contract = Counter { val: 0 };
    contract.decrement();
    assert_eq!(-1, contract.get_num());
    }

    increment_and_reset 함수는 위와 동일하게 Counter 인스턴스를 생성한 후 incrementreset을 차례로 실행시켜서 마지막에 get_num으로 가져온 값이 0으로 잘 초기화되었는 지 확인합니다.

    #[test]
    fn increment_and_reset() {
    let mut contract = Counter { val: 0 };
    contract.increment(1);
    contract.reset();
    assert_eq!(0, contract.get_num());
    }

    마지막 panics_on_overflowpanics_on_underflow 함수는 should_panic 이라는 attributes를 가지고 있는데요. 해당 테스트는 오류가 예상되는 테스트로 오류가 발생하면 테스트를 통과합니다.

    #[test]
    #[should_panic]
    fn panics_on_overflow() {
    let mut contract = Counter { val: 127 };
    contract.increment();
    }

    #[test]
    #[should_panic]
    fn panics_on_underflow() {
    let mut contract = Counter { val: -128 };
    contract.decrement();
    }

    WELLDONE Code를 사용하여 스마트 컨트랙트 배포하기

    컨트랙트 컴파일하기

    WELLDONE Code는 NEAR에서 제공하는 기본 컴파일을 이용합니다. 이는 안정적인 컴파일을 제공하지만, 컨트랙트 실행 시 메소드의 파라미터를 직접 입력해야 하는 불편함이 있어, 추후 raen build를 이용한 컴파일 옵션도 제공할 예정입니다. raen build에 대한 자세한 정보는 다음 링크를 참고해주세요.

    스마트 컨트랙트를 컴파일하기 위해서 먼저 PROJECT TO COMPILE 섹션에서 컴파일하고자 하는 디렉토리와 컨트랙트가 작성된 언어를 선택합니다. 우리는 near/rs_counter와 Rust를 선택한 후, 컴파일 버튼을 클릭합니다.

    1_16

    컴파일이 진행되면 터미널에 진행상황이 로그로 표시됩니다. 컴파일이 완료되면 near/rs_counter/out/counter_contract.wasm 경로에서 컴파일된 wasm 파일이 생성된 것을 확인할 수 있습니다.

    노트

    만약 컴파일 이후에 코드에 수정 사항이 생겨 새로 컴파일을 진행해야 한다면, 기존에 생성되었던 out 디렉토리를 삭제하고 다시 컴파일해야 합니다.

    컨트랙트 배포하기

    컴파일이 완료되면 Deploy 버튼이 활성화될 것입니다. 해당 칸에 컨트랙트를 배포할 계정의 ID를 입력한 후 Deploy 버튼을 눌러 배포를 진행합니다. 이때 컨트랙트를 배포하는 계정은 연결된 지갑이 권한을 갖고 있는 계정이어야 합니다.

    1_17

    Deploy 버튼을 누르면 WELLDONE Wallet 익스텐션이 활성화되면서 다음과 같은 창이 나타납니다. 사용자가 SendTx를 누르면 트랜잭션을 전송하고, 트랜잭션 해시값이 리턴됩니다.

    1_18 1_19

    노트

    터미널에 {"type":"error","value":"User denied transaction signature"} 라는 로그가 출력된다면 열려져 있는 WELLDONE Wallet 익스텐션 창을 닫은 후 다시 시도해주세요.

    이후 트랜잭션 검증이 완료되고 성공적으로 Receipt를 가져온다면 터미널에 다음과 같은 로그가 출력되고, 좌측 패널에 배포된 컨트랙트의 정보를 보여줍니다.

    1_20 1_21

    WELLDONE Code를 사용하여 배포한 스마트 컨트랙트와 통신하기

    이제 WELLDONE Code에서 배포한 컨트랙트와 통신을 해보겠습니다. Methods 섹션에서는 컨트랙트에서 접근할 수 있는 메소드의 목록을 보여줍니다. 만약 인자가 필요하다면 Add Argument 버튼을 눌러 필요한 인자의 이름과 타입, 값을 추가할 수 있습니다. Deposit에는 트랜잭션과 함께 보낼 토큰량을 NEAR 혹은 yoctoNEAR 두 가지 단위로 지정할 수 있습니다. 이후 메소드의 종류에 맞게 Call 혹은 View 버튼을 눌러 컨트랙트를 실행할 수 있습니다.

    1_22

    NEAR에서 컨트랙트를 호출하는 방법에는 viewcall 두 가지가 있습니다. view 는 컨트랙트의 상태를 단순히 조회하는 함수를 호출할 때 사용하는 것으로서 가스 비용을 지불할 필요가 없습니다. 카운터 컨트랙트에서는 get_num 메소드가 view 함수에 해당합니다.

    call은 컨트랙트 내부의 상태를 변화시키는 함수를 호출할 때 사용하는 것으로, 가스 비용을 지불하는 트랜잭션이기 때문에 WELLDONE Wallet을 통한 서명이 필요합니다.

    get_num 메소드 실행하기

    먼저 view 함수인 get_num 메소드를 실행해보겠습니다. Methods에서 get_num을 선택하고 View 버튼을 클릭합니다. view 함수는 지갑을 통해 서명할 필요가 없기 때문에 지갑과의 인터랙션이 필요하지 않습니다. 메소드 실행이 성공한다면 터미널에 메소드를 실행한 결과가 출력되는 것을 확인할 수 있습니다.

    1_23

    imcrement, decrement, reset 메소드 실행하기

    다음으로 change 함수인 incrementdecrement 메소드를 실행해보겠습니다. 먼저 Methods에서 increment를 선택하고 해당 메소드는 다른 인자를 필요로 하지 않으므로 인자를 추가하지 않고 Call 버튼을 클릭합니다. 그러면 WELLDONE Wallet 익스텐션 창이 나타나고, SendTx 버튼을 누르면 트랜잭션 해시가 반환됩니다. 트랜잭션이 성공하면 터미널에 다음과 같이 트랜잭션 결과가 나타납니다.

    1_24

    이후 다시 get_num 메소드를 실행해서 값을 가져와보면 성공적으로 카운터가 1로 증가한 것을 확인할 수 있습니다. decrementreset 메소드도 동일한 방법으로 실행할 수 있습니다.

    Wrap-Up

    우리는 WELLDONE Code를 사용해서 NEAR에서 컨트랙트를 작성하고, 배포하고, 실행하는 방법을 배웠습니다. WELLDONE Code를 사용하면 추가적인 환경 설정 없이 WELLDONE Wallet만을 이용해서 스마트 컨트랙트를 개발할 수 있습니다. Universal Provider를 사용해서 프론트엔드와 스마트 컨트랙트가 통신하는 방법을 알고 싶다면 다음 튜토리얼을 참고해주세요.

    - + \ No newline at end of file diff --git a/ko/tutorials/near/rust/near-frontend/index.html b/ko/tutorials/near/rust/near-frontend/index.html index 0ccd5e89d..d85a39852 100644 --- a/ko/tutorials/near/rust/near-frontend/index.html +++ b/ko/tutorials/near/rust/near-frontend/index.html @@ -8,7 +8,7 @@ - + @@ -155,7 +155,7 @@ } }
    결과
    Loading...

    Using Wallet Selector

    Wallet Selector 는 NEAR에서 공식적으로 지원하는 프로젝트로, NEAR 프로토콜을 지원하는 다양한 지갑과 dApp 사용자가 편하게 소통할 수 있도록 지갑의 주요 기능을 추상화하여 제공합니다. 사용자는 원하는 지갑을 선택한 후, Wallet Selector에서 제공하는 추상화 메소드를 사용하여 지갑과 통신할 수 있습니다.
    Log in 버튼을 눌러 WELLDONE Wallet에 연결한 후, Send a Transaction 버튼을 클릭하여increment 메소드를 실행시켜 보세요. Get Count 버튼을 누르면 컨트랙트의 현재 카운트 값을 확인할 수 있습니다.

    WELLDONE Wallet은 Wallet Selector가 공식적으로 지원하는 지갑입니다. Wallet Selector를 사용하여 트랜잭션을 보내는 전체 코드가 궁금하다면 깃허브를 확인해주세요.

    - + \ No newline at end of file diff --git a/ko/tutorials/sui-game/game/index.html b/ko/tutorials/sui-game/game/index.html index 620c12a68..e341370d0 100644 --- a/ko/tutorials/sui-game/game/index.html +++ b/ko/tutorials/sui-game/game/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ study_u_and_i_1_2

    2. Change to the testnet

    Since the game contract is deployed on the testnet, change the network to the testnet in your wallet. study_u_and_i_7_1 study_u_and_i_7_2

    3. Connect to WELLDONE Wallet

    When the wallet pops up, click the Accept button to connect the wallet.

    study_u_and_i_2_1

    4. Faucet your account

    You need to get funds to pay for gas. From your wallet, go to the Faucet tab, click the Request Faucet button, and wait for a second.

    정보

    Our wallet uses cURL to request test tokens, and the testnet rpc is sometimes unstable. In that case, please refer to this page. You can request test tokens through Sui Discord.

    study_u_and_i_8_1

    5. SHOP

    If the wallet connection is successful, your Sui address will appear in the top left corner of the screen. Then, go to the SHOP.

    study_u_and_i_3_1

    Buy one Axe and one Enchant Scroll. Select each item in turn and click the blue button. When the wallet pops up, click the Send button to buy an item.

    정보

    Your test account must have funds to pay for gas.

    study_u_and_i_3_2

    After sending each transaction, you can look up the received Tx Hash in SUI Explorer to check the items that you bought.

    study_u_and_i_3_3

    6. INVENTORY

    In the INVENTORY, you can view the items you have.

    study_u_and_i_4_1

    If you followed the previous steps, you may have one Axe and one Scroll. The number in the Axe item box indicates the current level of the item. If you just bought the item, it will probably be 0.

    And the number in the Scroll item box is the number of levels an item can be upgraded by spending that scroll.

    7. UPGRADE

    You will now spend a Scroll to enchant your Axe. Go to the UPGRADE and select the Axe and Scroll.

    study_u_and_i_5_1

    After enchanting, the level of the Axe will be 1 higher than its current level plus the level of the Scroll. This is because items are enchanted using the code below:

        item_axe.level = item_axe.level + item_scroll.level + bonus;

    The bonus is determined by the output value of the Verifiable Random Function (VRF). Study U&I uses Sui's VRF to enchant items.

    Why is the Verifiable Random Function important?
    A Verifiable Random Function (VRF) enables the holder of a private key to generate a hashed value for the message, which can be verified by anyone possessing the corresponding public key to ensure the validity of the hash. Therefore, by using VRF users have the ability to verify the random value used in games. Moreover, it also allows users can provide an input seed for the game company to use when generating a random value, and users can always verify that the game company used that seed to generate the random. It is transparent.

    However this demo version doesn't have a backend server, so it uses a pre-generated fixed VRF value. Therefore, the value of the bonus is always 1.

    For the full Study U&I Smart Contract code, how to deploy it, and more information about VRF, check out the Building a Game on Sui with VRF and Dynamic NFTs.

    Click the enchant button. When the wallet pops up, click the Send button to enchant an item.

    study_u_and_i_5_2

    8. Last Step

    After enchanting, you can check in your inventory or Sui Explorer that the Axe leveled up and the Scroll was burned. The image of the Axe will also change based on the specific item level.

    study_u_and_i_6_1study_u_and_i_6_2

    The current version focuses more on how to use VRF in the game, rather than the gameplay. For gameplay, stay tuned for our next series.

    - + \ No newline at end of file diff --git a/ko/tutorials/sui-game/index.html b/ko/tutorials/sui-game/index.html index d1088c03d..7049dc2e0 100644 --- a/ko/tutorials/sui-game/index.html +++ b/ko/tutorials/sui-game/index.html @@ -8,13 +8,13 @@ - +

    Building a Game on Sui with VRF and Dynamic NFTs

    July 17, 2023
    Hyunsun Yoo
    Software Engineer, DSRV

    Introduction

    template-code-sui

    Here is an educational game prototype that can be fast, scalable, and transparent with mutable, fully on-chain NFTs and verifiable random function. Sui has a lot of unique features. Sui’s unique language, Move is awesome: It’s safe, efficient for blockchain, and resistant to vulnerabilities such as reentrancy. But without move expertise, here's an easy way to build a game on Sui, with a web IDE that doesn't require any development setup. And let's take a look at how Sui's unique features, such as dynamic NFTs and VRF, can enhance the gaming experience.

    🎮 Study U&I, is playable now.

    Code Tutorials

    Smart Contract: Item Struct

        /// Item NFT
    struct Item has key, store {
    id: UID,
    name: string::String,
    description: string::String,
    url: Url,

    /// TODO: add custom attributes
    itemType: u8,
    level: u8,
    }

    Smart Contract: Ownership

        struct Ownership has key {
    id: UID
    }

    fun init(ctx: &mut TxContext) {
    let ownership = Ownership {
    id: object::new(ctx),
    };

    /// Transfer the ownership object to the module/package publisher
    transfer::transfer(ownership, tx_context::sender(ctx));
    }

    Use the Ownership object to ensure that only authorized people can mint and modify NFTs. In this example, the authorized person is the module/package publisher (the game company). Transfer the Ownership object to the publisher in the init function, which is executed only once when deploying the smart contract.

    Smart Contract: Create Item

        /// Create a new Item by contract owner
    public entry fun mint(
    _: &Ownership,
    name: vector<u8>,
    description: vector<u8>,
    url: vector<u8>,
    itemType: u8,
    recipient: address,
    ctx: &mut TxContext
    ) {
    let sender = tx_context::sender(ctx);
    let item = Item {
    id: object::new(ctx),
    name: string::utf8(name),
    description: string::utf8(description),
    url: url::new_unsafe_from_bytes(url),
    itemType: itemType,
    level: 0
    };

    event::emit(ItemMinted {
    object_id: object::id(&item),
    creator: sender,
    name: item.name,
    });

    transfer::public_transfer(item, recipient);
    }

    By taking Ownership as the parameter, only addresses that own the Ownership object can call the mint function.

    Smart Contract: Request Updating Item

        /// An object for consign
    struct ConsignedObj has key, store {
    id: UID,
    /// owner of the consigned object
    sender: address,
    /// the consigned object
    item_axe: Option<ID>,
    item_scroll: Option<ID>,
    }

    ConsignedObj is an object for consigning an item to the game company to request an update on the item.

        /// `users` create a consign for consigning
    /// an Item to `third_party`
    public entry fun create(
    third_party: address,
    item_axe: Item,
    item_scroll: Item,
    ctx: &mut TxContext
    ) {
    assert!(item_axe.itemType == 0 && item_scroll.itemType != 0, EItemType);
    assert!(item_axe.level < 255 && item_scroll.level > 0, EItemLevel);

    let sender = tx_context::sender(ctx);
    let consigned = ConsignedObj { id: object::new(ctx), item_axe: option::none(), item_scroll: option::none(), sender: sender };

    option::fill(&mut consigned.item_axe, object::id(&item_axe));
    dynamic_object_field::add(&mut consigned.id, 0, item_axe);

    option::fill(&mut consigned.item_scroll, object::id(&item_scroll));
    dynamic_object_field::add(&mut consigned.id, 1, item_scroll);

    // consign the object with the trusted third party
    transfer::public_transfer(consigned, third_party);
    }
    }

    Users can call the create function to request enchanting their item. In the second parameter, pass the Axe item want to enchant, and in the third parameter, pass the Scroll item want to spend to enchant.

    Smart Contract: Update Item

        /// Trusted third party can update nft
    /// Update the `level` of 'Item'
    public entry fun upgrade_level(_: &Ownership, obj: ConsignedObj, output: vector<u8>, input: vector<u8>, public_key: vector<u8>, proof: vector<u8>, ctx: &mut TxContext) {
    let verified = ecvrf::ecvrf_verify(&output, &input, &public_key, &proof);
    event::emit(VerifiedEvent {is_verified: verified});

    assert!(!verified, ENotVerified);

    let third_party = tx_context::sender(ctx);
    let ConsignedObj {
    id: id,
    sender: sender,
    item_axe: temp_a,
    item_scroll: temp_b,
    } = obj;

    let item_axe: Item = dynamic_object_field::remove(&mut id, 0);
    let item_axe_id = option::extract(&mut temp_a);
    assert!(object::id(&item_axe) == item_axe_id, 0);

    let item_scroll: Item = dynamic_object_field::remove(&mut id, 1);
    let item_scroll_id = option::extract(&mut temp_b);
    assert!(object::id(&item_scroll) == item_scroll_id, 0);

    assert!(item_axe.itemType == 0 && item_scroll.itemType != 0, EItemType);
    assert!(item_axe.level < 255 && item_scroll.level > 0, EItemLevel);

    let popedOutput = vector::pop_back(&mut output);
    let bonus: u8 = if (popedOutput > 128) { 1 } else { 0 };

    item_axe.level = item_axe.level + item_scroll.level + bonus;

    event::emit(ItemUpgrade {
    object_id: item_axe_id,
    creator: third_party,
    name: item_axe.name,
    level: item_axe.level,
    });

    object::delete(id);
    transfer::public_transfer(item_axe, sender);
    burn(item_scroll, ctx);
    }

    The module/package publisher (the game company) can enchant an item. There are three main parts to enchanting:

    1. Verifiable Random Function (VRF)
    • The enchant function takes parameters a random output, alpha_string, public_key, and proof generated by the game company via VRF. Then inside the function, the random output is verified, and if it passes, the result of random output determines whether or not to grant bonus levels when enchanting items.
    Why is the Verifiable Random Function important in games?
    A Verifiable Random Function (VRF) enables the holder of a private key to generate a hashed value for the message, which can be verified by anyone possessing the corresponding public key to ensure the validity of the hash. Therefore, by using VRF users have the ability to verify the random value used in games. Moreover, it also allows users can provide an input seed for the game company to use when generating a random value, and users can always verify that the game company used that seed to generate the random. Since the Random Function is such an important component of gaming and blockchain, it's important to provide transparent random for Sui users.
    • For example, the game company will generate the random output using information about the user as an input seed. Then the user can always verify that the game company generated the random value with information about them.
    1. Dynamic NFTs
    • Once the random output determines how much the item will level up, change the properties of the NFT. All game items such as weapons and armor are all Dynamic NFTs on-chain. As users enchant their item with scroll, attributes such as level, power, and delay are all updated live and can be checked through Sui Explorer.
    Why is the Dynamic NFTs important in games?
    Traditional NFTs are immutable once minted, while Dynamic NFTs are programmed to change their value based on external inputs. Using Dynamic NFTs in the game enables a program to change the properties of a user's items to become more powerful based on the user's contributions as they progress through the game. Sui's fast speed allows for real-time changes of NFT in fast-paced games. Additionally, Sui's comprehensive support for fully on-chain NFTs enables dynamic NFTs, which offer great advantages in gaming applications.
    1. Returning NFT to the user who requested the enchanting
    • Using the ConsignedObj, return NFT to the user who requested the enchanting.

    Deploy Smart Contract with WELLDONE Code

    정보

    Please refer to here to get started.

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    template-code-sui
    정보

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory sui/. If you start a new project, the structure should look like the following.

    sui
    └── item
    ├── Move.toml
    ├── Move.lock
    └── sources
    └── item.move

    Source Code

    item.move
    module examples::item {
    use sui::url::{Self, Url};
    use std::string;
    use sui::object::{Self, ID, UID};
    use sui::event;
    use sui::transfer;
    use sui::tx_context::{Self, TxContext};
    use std::option::{Self, Option};
    use sui::dynamic_object_field;
    use sui::ecvrf;
    use std::vector;

    /// Item NFT
    struct Item has key, store {
    id: UID,
    name: string::String,
    description: string::String,
    url: Url,

    /// TODO: add custom attributes
    itemType: u8,
    level: u8,
    }

    struct Ownership has key {
    id: UID
    }

    /// An object for consign
    struct ConsignedObj has key, store {
    id: UID,
    /// owner of the consigned object
    sender: address,
    /// the consigned object
    item_axe: Option<ID>,
    item_scroll: Option<ID>,
    }

    fun init(ctx: &mut TxContext) {
    let ownership = Ownership {
    id: object::new(ctx),
    };

    /// Transfer the ownership object to the module/package publisher
    transfer::transfer(ownership, tx_context::sender(ctx));
    }

    // ===== Error codes =====

    const ENotVerified: u64 = 0;
    const EItemType: u64 = 1;
    const EItemLevel: u64 = 2;

    // ===== Events =====

    struct ItemMinted has copy, drop {
    // The Object ID of the Item
    object_id: ID,
    // The creator of the Item
    creator: address,
    // The name of the Item
    name: string::String,
    }

    struct ItemUpgrade has copy, drop {
    // The Object ID of the Item
    object_id: ID,
    // The creator of the Item
    creator: address,
    // The name of the Item
    name: string::String,

    level: u8,
    }

    /// Event on whether the output is verified
    struct VerifiedEvent has copy, drop {
    is_verified: bool,
    }

    // ===== Public view functions =====

    /// Get the Item's `name`
    public fun name(item: &Item): &string::String {
    &item.name
    }

    /// Get the Item's `description`
    public fun description(item: &Item): &string::String {
    &item.description
    }

    /// Get the Item's `url`
    public fun url(item: &Item): &Url {
    &item.url
    }

    /// Get the Item's `itemType`
    public fun item_typel(item: &Item): &u8 {
    &item.itemType
    }

    /// Get the Item's `level`
    public fun level(item: &Item): &u8 {
    &item.level
    }

    // ===== Entrypoints =====

    /// Create a new Item
    fun mint_internal(
    name: vector<u8>,
    description: vector<u8>,
    url: vector<u8>,
    itemType: u8,
    level: u8,
    ctx: &mut TxContext,
    ) {
    let item = Item {
    id: object::new(ctx),
    name: string::utf8(name),
    description: string::utf8(description),
    url: url::new_unsafe_from_bytes(url),
    itemType: itemType,
    level: level,
    };

    event::emit(ItemMinted {
    object_id: object::id(&item),
    creator: tx_context::sender(ctx),
    name: item.name,
    });

    transfer::public_transfer(item, tx_context::sender(ctx));
    }

    public entry fun buy(
    itemType: u8,
    ctx: &mut TxContext
    ) {
    if (itemType == 0) {
    let name = b"axe";
    let desc = b"axe";
    let url = b"https://";
    mint_internal(name, desc, url, itemType, 0, ctx);
    };
    if (itemType == 1) {
    let name = b"scroll 1";
    let desc = b"scroll 1";
    let url = b"https://";
    mint_internal(name, desc, url, itemType, 3, ctx);
    };
    if (itemType == 2) {
    let name = b"scroll 2";
    let desc = b"scroll 2";
    let url = b"https://";
    mint_internal(name, desc, url, itemType, 6, ctx);
    };
    if (itemType == 3) {
    let name = b"scroll 3";
    let desc = b"scroll 3";
    let url = b"https://";
    mint_internal(name, desc, url, itemType, 9, ctx);
    };
    }

    /// Create a new Item by contract owner
    public entry fun mint(
    _: &Ownership,
    name: vector<u8>,
    description: vector<u8>,
    url: vector<u8>,
    itemType: u8,
    recipient: address,
    ctx: &mut TxContext
    ) {
    let sender = tx_context::sender(ctx);
    let item = Item {
    id: object::new(ctx),
    name: string::utf8(name),
    description: string::utf8(description),
    url: url::new_unsafe_from_bytes(url),
    itemType: itemType,
    level: 0
    };

    event::emit(ItemMinted {
    object_id: object::id(&item),
    creator: sender,
    name: item.name,
    });

    transfer::public_transfer(item, recipient);
    }

    /// Transfer `Item` to `recipient`
    public entry fun transfer(
    item: Item, recipient: address, _: &mut TxContext
    ) {
    transfer::public_transfer(item, recipient)
    }

    /// `users` create a consign for consigning
    /// an Item to `third_party`
    public entry fun create(
    third_party: address,
    item_axe: Item,
    item_scroll: Item,
    ctx: &mut TxContext
    ) {
    assert!(item_axe.itemType == 0 && item_scroll.itemType != 0, EItemType);
    assert!(item_axe.level < 255 && item_scroll.level > 0, EItemLevel);

    let sender = tx_context::sender(ctx);
    let consigned = ConsignedObj { id: object::new(ctx), item_axe: option::none(), item_scroll: option::none(), sender: sender };

    option::fill(&mut consigned.item_axe, object::id(&item_axe));
    dynamic_object_field::add(&mut consigned.id, 0, item_axe);

    option::fill(&mut consigned.item_scroll, object::id(&item_scroll));
    dynamic_object_field::add(&mut consigned.id, 1, item_scroll);

    // consign the object with the trusted third party
    transfer::public_transfer(consigned, third_party);
    }

    /// Trusted third party can update nft
    /// Update the `level` of 'Item'
    public entry fun upgrade_level(_: &Ownership, obj: ConsignedObj, output: vector<u8>, input: vector<u8>, public_key: vector<u8>, proof: vector<u8>, ctx: &mut TxContext) {
    let verified = ecvrf::ecvrf_verify(&output, &input, &public_key, &proof);
    event::emit(VerifiedEvent {is_verified: verified});

    assert!(!verified, ENotVerified);

    let third_party = tx_context::sender(ctx);
    let ConsignedObj {
    id: id,
    sender: sender,
    item_axe: temp_a,
    item_scroll: temp_b,
    } = obj;

    let item_axe: Item = dynamic_object_field::remove(&mut id, 0);
    let item_axe_id = option::extract(&mut temp_a);
    assert!(object::id(&item_axe) == item_axe_id, 0);

    let item_scroll: Item = dynamic_object_field::remove(&mut id, 1);
    let item_scroll_id = option::extract(&mut temp_b);
    assert!(object::id(&item_scroll) == item_scroll_id, 0);

    assert!(item_axe.itemType == 0 && item_scroll.itemType != 0, EItemType);
    assert!(item_axe.level < 255 && item_scroll.level > 0, EItemLevel);

    let popedOutput = vector::pop_back(&mut output);
    let bonus: u8 = if (popedOutput > 128) { 1 } else { 0 };

    item_axe.level = item_axe.level + item_scroll.level + bonus;

    event::emit(ItemUpgrade {
    object_id: item_axe_id,
    creator: third_party,
    name: item_axe.name,
    level: item_axe.level,
    });

    object::delete(id);
    transfer::public_transfer(item_axe, sender);
    burn(item_scroll, ctx);
    }

    /// Permanently delete `Item`
    public entry fun burn(item: Item, _: &mut TxContext) {
    let Item { id, name: _, description: _, url: _, itemType: _, level : _, } = item;
    object::delete(id)
    }
    }
    Move.toml
    [package]
    name = "Examples"
    version = "0.0.1"

    [dependencies]
    Sui = { git = "https://github.com/MystenLabs/sui.git", subdir="crates/sui-framework/packages/sui-framework/", rev = "testnet" }

    [addresses]
    examples = "0x0"

    Requirement

    In this scenario, you need two accounts. An account that acts as the game company that will deploy the Smart Contract, and an account that acts as the game user.

    Compile The Source Code

    Connect to the WELLDONE Code with a game company account, and select the project you want to compile. For now, let's choose sui/item and click Compile button.

    02_project-to-compile-item

    Deployment

    If the compilation succeed, you can see mv file item.mv.

    Click the Deploy button.

    03_build-file-item

    and you can see wallet popup. Let's click Send button.

    04_sui-wallet-popup

    Check Out Deployed Contract

    After deployment, you can see Item module and functions.

    Calling Contract Functions

    1. Change to a game user account, and Select buy function. Input 0 to buy an axe, and click buy button. And input 1 to buy a scroll, and click buy button.

    2. After sending each transaction, look up the received Tx Hash in SUI Explorer to check the object ID of the item that you bought for the next step.

    3. Run the create function. The first parameter is the game company address that deployed this Smart Contract. The second parameter is an object Id of the item that you bought, The value you checked in step 2. The third parameter is the same, but one of these parameters must be axe, and scroll, respectively.

    4. After sending the create transaction, look up the received Tx Hash in SUI Explorer to check the object ID of the ConsignedObj for the next step.

    5. Return to the game company account and run the upgrade_level function. The first parameter is the object ID of Ownership. And the second parameter is the object ID of ConsignedObj that you checked in Step 4. The third through sixth parameters are associated with the VRF.

    6. After enchant transaction, check if Item was returned to the game user and updated in SUI Explorer.


    Reference

    https://examples.sui.io/samples/nft.html

    https://docs.sui.io/learn/cryptography/ecvrf

    - + \ No newline at end of file diff --git a/ko/tutorials/sui-move-coin/index.html b/ko/tutorials/sui-move-coin/index.html index 8b206cae8..132a3f9dd 100644 --- a/ko/tutorials/sui-move-coin/index.html +++ b/ko/tutorials/sui-move-coin/index.html @@ -8,7 +8,7 @@ - + @@ -20,7 +20,7 @@ Second parameter is the amount of the minting coin. Third parameter is the receiver of the minting coin. For now, set the receiver to your account address.

    06_sui-my-coin-mint
  • After mint transaction, check if MYCOIN was minted in SUI Explorer.

    07_sui-my-coin-minted
  • Try more...

    1. Call burn function and check it out in SUI Explorer.
    2. Read about One Time Witness (OTW).

    Reference

    https://examples.sui.io/basics/one-time-witness.html https://github.com/MystenLabs/sui/tree/main/sui_programmability/examples/fungible_tokens

    - + \ No newline at end of file diff --git a/ko/tutorials/sui-zklogin/index.html b/ko/tutorials/sui-zklogin/index.html index e98cadb12..b83d13f23 100644 --- a/ko/tutorials/sui-zklogin/index.html +++ b/ko/tutorials/sui-zklogin/index.html @@ -8,13 +8,13 @@ - +

    Sui zkLogin

    January 16, 2024
    Sooyoung Hyun
    Lead Software Engineer, DSRV

    Introduction

    블록체인 기술의 발전은 사용자 인터페이스와 보안에 대한 새로운 요구사항을 제시하고 있습니다. 이러한 배경 속에서, WELLDONE zkWallet은 Sui 블록체인의 zkLogin 기능을 통합하여 사용자가 기존의 Web2 자격 증명을 사용하여 블록체인 서비스에 효율적으로 접근할 수 있는 방법을 제공합니다. 이 글에서는 WELLDONE zkWallet이 zkLogin을 활용하여 사용자 경험을 향상시키고 다양한 브라우저 확장 지갑과의 연결을 용이하게 하는 방법을 탐구할 것입니다.

    WELLDONE zkWallet and Sui's zkLogin: A Structural Approach to Enhancing User Experience and Security

    WELLDONE zkWallet이 Sui의 zkLogin 기능을 통합하는 방식은 블록체인 기술의 접근성과 보안성을 동시에 향상시키는 구조적 접근법을 제공합니다. 이러한 통합은 다음과 같은 방식으로 이루어집니다.

    1. 별도 웹페이지 통합: WELLDONE zkWallet은 사용자가 다양한 브라우저 확장 지갑을 선택하고 연결할 수 있는 별도의 웹페이지를 제공합니다. 이 웹페이지는 Sui의 zkLogin 기능과 직접 통합되어, 사용자가 기존의 Web2 자격 증명을 사용하여 블록체인 서비스에 접근할 수 있게 합니다.

    2. 영지식 증명 메커니즘: zkLogin의 핵심은 영지식 증명 기술입니다. 이 기술을 통해 사용자는 자신의 신원 정보를 숨긴 채로 블록체인 서비스에 안전하게 접근할 수 있습니다. 사용자는 신원을 공개하지 않고 서비스에 접근할 수 있으며, 이 과정은 개인 정보를 완벽하게 보호합니다.

    3. 이중 인증 메커니즘: WELLDONE zkWallet은 지갑 키 관리와 OAuth 인증을 결합하여 이중 보안 계층을 제공합니다. 사용자는 지갑에 접근하기 위해 두 가지 요소를 모두 만족시켜야 합니다: 지갑의 개인 키와 OAuth 제공자를 통한 이중 인증 접근 방식. 이는 단일 인증 방법보다 훨씬 강력한 보안을 제공합니다. 특히, WELLDONE zkWallet은 웹 인터페이스를 통해 Web2 자격 증명 토큰과 ephemeral key pairs을 분리하여 저장함으로써 추가적인 보안 메커니즘을 제공합니다.

    4. 다양한 지갑과의 호환성:: WELLDONE zkWallet은 다양한 브라우저 확장 지갑과 호환되도록 표준화되고 설계되었습니다. 지갑 개발자들은 zkLogin을 사용하기 위해 추가적인 개발이 필요 없으며, 사용자는 자신의 선호에 따라 다양한 지갑 옵션을 선택할 수 있어 더 넓은 범위의 사용자 요구를 충족시킵니다.

    5. 간소화된 사용자 인터페이스: WELLDONE zkWallet의 웹 인터페이스는 사용자 친화적이고 직관적입니다. 사용자는 몇 번의 클릭만으로 웹 계정을 통해 지갑에 접근할 수 있어 편리함을 제공하면서도 보안을 유지합니다.

    6. Dapp과의 원활한 통합: WELLDONE zkWallet은 다양한 분산 애플리케이션(Dapp)과의 직접적인 상호작용을 지원합니다. 이를 통해 사용자는 웹 지갑을 통해 Dapp을 더 효율적으로 사용할 수 있습니다. Dapp과의 상호작용에 대한 정보는 이 문서에서 확인할 수 있습니다.

    이러한 구조적 접근 방식은 블록체인 기술의 복잡성을 줄여 사용자가 이해하고 활용하기 쉽게 만듭니다. WELLDONE zkWallet의 통합은 사용자가 기술적 장벽에 대한 걱정 없이 블록체인 기술을 쉽고 안전하게 사용할 수 있도록 하는 데 중점을 둡니다. 이제 다음 튜토리얼을 통해 더 자세히 살펴보겠습니다.

    Tutorial

    이 튜토리얼을 실행하는 동영상을 보려면 여기를 클릭하세요.

    호환 가능 지갑
    • WELLDONE Wallet, Sui Wallet, Elli Wallet
    1. WELLDONE Wallet 또는 다른 브라우저 확장 지갑을 설치하세요. 확장 지갑의 공개 키와 OAuth 로그인을 통해 JSON 웹 토큰(JWT)을 받게 되며, 확장 지갑의 개인 키로 트랜잭션에 서명할 수 있습니다. 실습을 위해 Sui 계정을 생성하고 네트워크를 Devnet으로 설정하세요.
    install-wallet
    1. https://zkwallet.welldonestudio.io에서 지갑을 사이트에 연결하세요. Sui Wallet을 통해 zkLogin으로 이미 생성된 주소를 사용하는 것은 공개 키를 모르기 때문에 작동하지 않는 것을 유의하세요.
    connect-wallet
    1. 자격 증명을 통해 OpenID 제공자(OP) 로부터 JWT를 획득합니다.
    oauth-login
    1. 그러면 아래와 같이 Sui의 첫 번째 웹 지갑인 WELLDONE zkWallet에 로그인하게 됩니다. 새로운 주소는 확장 지갑의 공개 키, JWT, 사용자 솔트를 사용하여 생성됩니다. 이 주소의 키 쌍은 알 수 없습니다. 그러나 지갑 키와 OP 인증과 같은 독립적인 요소를 통해 제어함으로써 강력한 보안을 얻을 수 있습니다.
    check-address
    1. Faucet를 통해 SUI 코인을 받고 Stake 트랜잭션을 실행합니다.
    send-tx
    1. 브라우저 확장 지갑의 계정 개인 키로 트랜잭션에 서명합니다.
    sign-tx
    1. 트랜잭션이 성공적으로 전송되었고 stake 함수가 실행되었음을 확인할 수 있습니다.
    check-result

    위에서 설명한 과정은 다음과 같이 요약할 수 있습니다.

    process

    또한 아래 이미지에서 보이는 것처럼, "지갑 추가" 기능을 통해 여러 계정 주소를 생성할 수 있습니다. 이는 단일 JWT로 여러 계정 주소를 생성할 수 있게 하는 사용자의 솔트만 변경하면 가능합니다.

    add-wallet

    용어와 내부 작동에 대한 자세한 설명은 Sui documentation를 참조하세요.

    Conclusion

    Sui의 zkLogin 기능을 사용하는 Sui 웹 지갑의 작동 방식을 살펴보았습니다. 확장 지갑과 zkLogin 인증 과정의 분리는 다양한 지갑 옵션과의 호환성을 높입니다. 사용자는 선호하는 지갑을 선택할 수 있으며, WELLDONE zkWallet의 인증 시스템은 이러한 다양한 지갑과 원활하게 통합됩니다. 이는 사용자에게 더 많은 선택권을 제공하고 다양한 사용자 요구를 충족시킵니다. 니모닉이나 개인 키 관리가 필요한 확장 지갑은 레저 지갑처럼 사용할 수 있습니다.

    또한 웹 지갑은 다양한 Dapp과 직접 상호작용할 수 있습니다. Dapp과 웹 지갑 간의 상호작용은 이 문서에서 확인할 수 있습니다.

    Sui zkLogin과 WELLDONE zkWallet의 통합을 통해 사용자는 블록체인 기술을 더 안전하고 직관적으로 사용할 수 있습니다. 이러한 혁신을 통해 WELLDONE zkWallet은 블록체인 기술의 실용성과 보안성을 향상시키며 사용자 경험을 새로운 수준으로 끌어올릴 것으로 기대합니다.

    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/execute-the-contract/ethereum-celo-klaytn/index.html b/ko/wallet/developer-guide/execute-the-contract/ethereum-celo-klaytn/index.html index a3c400b99..6db998a93 100644 --- a/ko/wallet/developer-guide/execute-the-contract/ethereum-celo-klaytn/index.html +++ b/ko/wallet/developer-guide/execute-the-contract/ethereum-celo-klaytn/index.html @@ -8,13 +8,13 @@ - +

    Ethereum, Celo, Klaytn

    Ethereum, Celo, Klaytn에서 배포된 EVM계 열의 컨트랙트는 배포 시 abi가 추출되기 때문에 ethersweb3.js 와 같은 편의 라이브러리를 이용해 컨트랙트를 실행시키는 것이 편리합니다.

    Ethers

    Params

    new ethers.Contract( address , abi , providerOrSigner )

    • address - String: 요청할 컨트랙트의 주소
    • abi - Object: contract의 json interface
    • providerOrSigner : constructor에 의해 제공되는 provider또는 signer
    // Read-Only; By connecting to a Provider, allows:
    // - Any constant function
    // - Querying Filters
    // - Populating Unsigned Transactions for non-constant methods
    // - Estimating Gas for non-constant (as an anonymous sender)
    // - Static Calling non-constant methods (as anonymous sender)
    const myContract = new ethers.Contract(address, abi, provider);

    // Read-Write; By connecting to a Signer, allows:
    // - Everything from Read-Only (except as Signer, not anonymous)
    // - Sending transactions for non-constant functions
    const myContract_rw = new ethers.Contract(address, abi, signer);

    web3.js

    Params

    new web3.eth.Contract(jsonInterface[, address][, options])

    • jsonInterface - Object: contract의 json interface
    • address - String (optional): 요청할 컨트랙트의 주소
    • options - Object (optional): 컨트랙트의 옵션
      • from - String: 요청을 보내는 계정의 address
      • gasPrice - String: 트랜잭션에 쓰이는 gas price
      • gas - Number: gas limit값
      • data - String: 컨트랙트의 바이트코드
    const myContract = new web3.eth.Contract([...], '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', {
    from: '0x1234567890123456789012345678901234567891', // default from address
    gasPrice: '20000000000' // default gas price in wei, 20 gwei in this case
    });
    정보

    자세한 내용은 편의 라이브러리의 공식 독스를 통해 접하실 수 있습니다.

    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/execute-the-contract/near/index.html b/ko/wallet/developer-guide/execute-the-contract/near/index.html index ef3843ffe..c7f459435 100644 --- a/ko/wallet/developer-guide/execute-the-contract/near/index.html +++ b/ko/wallet/developer-guide/execute-the-contract/near/index.html @@ -8,7 +8,7 @@ - + @@ -143,7 +143,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/getting-started/connecting-to-wallet/index.html b/ko/wallet/developer-guide/getting-started/connecting-to-wallet/index.html index 91e9dd2a1..828305052 100644 --- a/ko/wallet/developer-guide/getting-started/connecting-to-wallet/index.html +++ b/ko/wallet/developer-guide/getting-started/connecting-to-wallet/index.html @@ -8,7 +8,7 @@ - + @@ -65,7 +65,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/getting-started/detecting-provider/index.html b/ko/wallet/developer-guide/getting-started/detecting-provider/index.html index 181af85bb..4fbd3e757 100644 --- a/ko/wallet/developer-guide/getting-started/detecting-provider/index.html +++ b/ko/wallet/developer-guide/getting-started/detecting-provider/index.html @@ -8,7 +8,7 @@ - + @@ -61,7 +61,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/index.html b/ko/wallet/developer-guide/index.html index 8a28ad504..3af804205 100644 --- a/ko/wallet/developer-guide/index.html +++ b/ko/wallet/developer-guide/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/provider-api/chain-names/index.html b/ko/wallet/developer-guide/provider-api/chain-names/index.html index 72dd18fa6..e88d51c72 100644 --- a/ko/wallet/developer-guide/provider-api/chain-names/index.html +++ b/ko/wallet/developer-guide/provider-api/chain-names/index.html @@ -8,13 +8,13 @@ - +

    Chain Names

    다음은 WELLDONE Wallet이 지원하는 체인 이름입니다. 해당 이름들은 Universal Provider 메소드의 CHAIN_NAME 매개변수에 들어감으로써 멀티체인에 동일한 인터페이스로 접근할 수 있도록 지원합니다.

    Chain NameChainHD Path
    celestiaCelestiam/44'/118'/0'/0/ (celestia's default hd path)
    celoCelom/44'/52752'/0'/0/ (celo's default hd path)
    m/44'/60'/0'/0/ (ethereum compatible hd path)
    cosmosCosmosm/44'/118'/0'/0/ (cosmos's default hd path)
    ethereumEthereumm/44'/60'/0'/0/ (ethereum compatible hd path)
    junoJunom/44'/118'/0'/0/ (juno's default hd path)
    klaytnKlaytnm/44'/8217'/0'/0/ (klaytn's default hd path)
    m/44'/60'/0'/0/ (ethereum's default hd path)
    nearNEARm/44'/397'/0'/0/ (near's default hd path)
    neonNeonm/44'/60'/0'/0/ (ethereum compatible hd path)
    solanaSolanam/44'/501'/0'/0/ (solana's default hd path)
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/provider-api/events/index.html b/ko/wallet/developer-guide/provider-api/events/index.html index 896526fe3..fec44edcc 100644 --- a/ko/wallet/developer-guide/provider-api/events/index.html +++ b/ko/wallet/developer-guide/provider-api/events/index.html @@ -8,13 +8,13 @@ - +

    Events

    정보

    Universal Provider는 Node.js EventEmitter API를 통해 총 2개의 이벤트를 발생합니다.

    1. accountsChanged

    • dapp:accountsChanged 이벤트는 체인 내부의 계정 변경이 감지되었을 때 발생합니다. 콜백 함수의 인자로 변경된 계정 주소 address와 현재 체인의 이름 CHAIN_NAMECHAIN_NAME:address 형태로 반환합니다.
    type CHAIN_NAME = 'celestia' | 'celo' | 'cosmos' | 'ethereum' | 'juno' | 'klaytn' | 'near' | 'neon' | 'solana';

    window.dapp.on('dapp:accountsChanged', (currentAccount: string) => {
    console.log(currentAccount); // near:welldone.testnet
    });

    2. chainChanged

    • dapp:chainChanged 이벤트는 체인 내부의 네트워크 변경이 감지되었을 때 발생합니다. 콜백 함수의 인자로 변경된 네트워크의 IDnetworkID와 현재 체인의 이름 CHAIN_NAMECHAIN_NAME:networkID 형태로 반환합니다.
    type CHAIN_NAME = 'celestia' | 'celo' | 'cosmos' | 'ethereum' | 'juno' | 'klaytn' | 'near' | 'neon' | 'solana';

    window.dapp.on('dapp:chainChanged', (currentNetwork: string) => {
    console.log(currentNetwork); //celo:0xf370
    });
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/provider-api/how-we-wrap-for-multichain/index.html b/ko/wallet/developer-guide/provider-api/how-we-wrap-for-multichain/index.html index 57df9452a..86e9eb8ef 100644 --- a/ko/wallet/developer-guide/provider-api/how-we-wrap-for-multichain/index.html +++ b/ko/wallet/developer-guide/provider-api/how-we-wrap-for-multichain/index.html @@ -8,13 +8,13 @@ - +

    About Universal Provider

    How does the Universal Provider wrap for multi-chain developers?

    Web3 개발자는 멀티체인 환경을 지원하는 Universal Provider 덕분에 한 번의 요청으로 여러 라이브러리를 동시에 설치 및 관리할 필요 없이 Web3 개발 환경을 쉽게 다룰 수 있습니다. Universal Provider는 Ethereum의 ethers.js, NEAR 네트워크의 near-api-js, Cosmos의 cosmjs, Solana의 web3.js, Celo의 ContractKit, Polkadot의 util-crypto 라이브러리를 추상화했습니다.

    Universal Provider는 개발자 친화적인 WELLDONE Wallet과 직접 연결되기 때문에 지갑 단에서 여러 체인의 정보를 받는 미들웨어를 포함합니다. 예를 들어, Neon 네트워크를 통해 트랜잭션을 보내고 싶다면 dapp:signAndSendTransaction메소드만 활용하면 됩니다. 이 메소드는 request를 WELLDONE Wallet으로 라우팅하는 미들웨어입니다. Universal Provider는 개별 라이브러리를 이해할 필요가 없도록 모든 API 메소드를 추상화합니다. 다음 섹션에서 Universal Provider가 지원하는 메소드의 정보를 자세히 확인하세요.

    const DAPP_GET_ACCOUNT_METHOD = 'dapp:accounts';

    async function handleGetAccount() {
    try {
    const accounts = await dapp.request(CHAIN_NAME, {
    method: DAPP_GET_ACCOUNT_METHOD,
    });
    setAccounts(accounts[CHAIN_NAME].address);
    } catch (error) {
    alert(error.message);
    }
    }

    또한 Universal Provider는 여러 블록체인의 기본 라이브러리가 지원하는 API 메소드를 지원합니다. 체인별로 잘 알려진 라이브러리들의 요구사항을 Universal Provider에 직접 주입하고 추상화했기 때문에, 멀티체인 dApp을 만들 때 수많은 라이브러리를 관리하지 않아도 됩니다. 예를 들어, 기존의 eth_accounts 방법을 사용하여 모든 이더리움 계정 주소를 가져오도록 요청할 수 있습니다. 공식 문서의 API 메소드를 Universal Provider에서 바로 사용할 수 있습니다.

    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/provider-api/method/index.html b/ko/wallet/developer-guide/provider-api/method/index.html index 05413b850..ea108a264 100644 --- a/ko/wallet/developer-guide/provider-api/method/index.html +++ b/ko/wallet/developer-guide/provider-api/method/index.html @@ -8,7 +8,7 @@ - + @@ -558,7 +558,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/aptos/index.html b/ko/wallet/developer-guide/sending-transaction/aptos/index.html index efc0c7da7..5c5cb7509 100644 --- a/ko/wallet/developer-guide/sending-transaction/aptos/index.html +++ b/ko/wallet/developer-guide/sending-transaction/aptos/index.html @@ -8,7 +8,7 @@ - + @@ -160,7 +160,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/celestia/index.html b/ko/wallet/developer-guide/sending-transaction/celestia/index.html index d3a132a02..f590d19df 100644 --- a/ko/wallet/developer-guide/sending-transaction/celestia/index.html +++ b/ko/wallet/developer-guide/sending-transaction/celestia/index.html @@ -8,7 +8,7 @@ - + @@ -131,7 +131,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/celo/index.html b/ko/wallet/developer-guide/sending-transaction/celo/index.html index 789d8bf55..ac8ece61f 100644 --- a/ko/wallet/developer-guide/sending-transaction/celo/index.html +++ b/ko/wallet/developer-guide/sending-transaction/celo/index.html @@ -8,7 +8,7 @@ - + @@ -110,7 +110,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/cosmos/index.html b/ko/wallet/developer-guide/sending-transaction/cosmos/index.html index 6bde1fdd3..e397c8c0f 100644 --- a/ko/wallet/developer-guide/sending-transaction/cosmos/index.html +++ b/ko/wallet/developer-guide/sending-transaction/cosmos/index.html @@ -8,7 +8,7 @@ - + @@ -131,7 +131,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/ethereum/index.html b/ko/wallet/developer-guide/sending-transaction/ethereum/index.html index 9610f9441..4f7c5e3c9 100644 --- a/ko/wallet/developer-guide/sending-transaction/ethereum/index.html +++ b/ko/wallet/developer-guide/sending-transaction/ethereum/index.html @@ -8,7 +8,7 @@ - + @@ -114,7 +114,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/injective/index.html b/ko/wallet/developer-guide/sending-transaction/injective/index.html index abc11a768..cd9ac69c8 100644 --- a/ko/wallet/developer-guide/sending-transaction/injective/index.html +++ b/ko/wallet/developer-guide/sending-transaction/injective/index.html @@ -8,7 +8,7 @@ - + @@ -142,7 +142,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/klaytn/index.html b/ko/wallet/developer-guide/sending-transaction/klaytn/index.html index 89bc5d158..966e8c21d 100644 --- a/ko/wallet/developer-guide/sending-transaction/klaytn/index.html +++ b/ko/wallet/developer-guide/sending-transaction/klaytn/index.html @@ -8,7 +8,7 @@ - + @@ -110,7 +110,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/near/index.html b/ko/wallet/developer-guide/sending-transaction/near/index.html index 450ebcb6c..8b29bace9 100644 --- a/ko/wallet/developer-guide/sending-transaction/near/index.html +++ b/ko/wallet/developer-guide/sending-transaction/near/index.html @@ -8,7 +8,7 @@ - + @@ -140,7 +140,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/neon/index.html b/ko/wallet/developer-guide/sending-transaction/neon/index.html index d1ddbe253..69c2f7c61 100644 --- a/ko/wallet/developer-guide/sending-transaction/neon/index.html +++ b/ko/wallet/developer-guide/sending-transaction/neon/index.html @@ -8,7 +8,7 @@ - + @@ -114,7 +114,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/neutron/index.html b/ko/wallet/developer-guide/sending-transaction/neutron/index.html index c558dfc0d..1b98fef74 100644 --- a/ko/wallet/developer-guide/sending-transaction/neutron/index.html +++ b/ko/wallet/developer-guide/sending-transaction/neutron/index.html @@ -8,7 +8,7 @@ - + @@ -136,7 +136,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/solana/index.html b/ko/wallet/developer-guide/sending-transaction/solana/index.html index f3e45affb..e9dc8834d 100644 --- a/ko/wallet/developer-guide/sending-transaction/solana/index.html +++ b/ko/wallet/developer-guide/sending-transaction/solana/index.html @@ -8,7 +8,7 @@ - + @@ -137,7 +137,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/developer-guide/sending-transaction/sui/index.html b/ko/wallet/developer-guide/sending-transaction/sui/index.html index 068dba5cb..795b2ae2d 100644 --- a/ko/wallet/developer-guide/sending-transaction/sui/index.html +++ b/ko/wallet/developer-guide/sending-transaction/sui/index.html @@ -8,7 +8,7 @@ - + @@ -196,7 +196,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/index.html b/ko/wallet/index.html index 072c6a26a..4ffc29aaf 100644 --- a/ko/wallet/index.html +++ b/ko/wallet/index.html @@ -8,13 +8,13 @@ - +

    Wallet

    WELLDONE Wallet은 체인의 제한 없이 모든 네트워크에서 자산을 관리할 수 있는 비수탁형(Non-custodial)지갑입니다. 분산된 자산을 관리해야 한다고 여러분의 경험까지 분산되어야 하는 것은 아니죠. 수많은 블록체인 월렛에 흩어진 자산을 일일이 확인하는 것이 어려웠다면 다양한 네트워크를 지원하는 하나의 지갑 WELLDONE Wallet으로 통합된 웹3 경험을 시작할 수 있습니다.

    WELLDONE Wallet은 현재 앱토스(Aptos), 셀레스티아(Celestia), 셀로(Celo), 코스모스(Cosmos), 이더리움(Ethereum), 인젝티브(Injective), 주노(Juno), 클레이튼(Klaytn), 니어(NEAR), 네온(Neon), 솔라나(Solana), 수이(Sui) 총 9개 체인을 지원합니다.

    - + \ No newline at end of file diff --git a/ko/wallet/manual/how-to-add-a-token/index.html b/ko/wallet/manual/how-to-add-a-token/index.html index 739c8f2fd..5271ef5da 100644 --- a/ko/wallet/manual/how-to-add-a-token/index.html +++ b/ko/wallet/manual/how-to-add-a-token/index.html @@ -8,13 +8,13 @@ - +

    How to Add a Token

    Add Token

    Step 1: 계정 페이지에서 Add New Token 버튼을 클릭합니다.

    Step 2: 토큰 컨트랙트를 입력하면 나머지 토큰 정보가 자동으로 채워집니다. 채워진 정보를 확인하고 토큰 이름과 토큰 심볼은 수정할 수 있습니다.

    Step 3: Accept 버튼을 클릭하여 토큰을 추가합니다.

    7_17_2
    노트

    Solana의 경우 사용자 토큰을 사용하기 전에 렌트를 해야 합니다. 즉, 토큰을 처음으로 추가할때 한번은 렌트를 위한 수수료가 필요합니다. 만약 사용자가 추가하려는 토큰을 처음 사용하는 것이라면 위의 과정에서 수수료가 소모됩니다.

    Edit & Hide Token

    노트

    지갑에서 기본적으로 제공하는 토큰은 수정 및 삭제가 불가능하지만 사용자가 직접 추가한 토큰은 언제든지 수정 및 삭제할 수 있습니다.

    Step 1: 계정 페이지에서 수정하려는 토큰을 클릭합니다.

    Step 2: 토큰 창에서 Edit 버튼을 클릭합니다.

    7_37_4

    Edit Token

    토큰 이름과 토큰 심볼을 수정하고 Save 버튼을 클릭하면 토큰 정보가 수정됩니다.

    7_5

    Hide Token

    Hide Token 버튼을 클릭해 토큰을 지갑에서 삭제합니다.

    7_6
    - + \ No newline at end of file diff --git a/ko/wallet/manual/how-to-create-a-wallet/index.html b/ko/wallet/manual/how-to-create-a-wallet/index.html index afc4e5e00..72cc059d8 100644 --- a/ko/wallet/manual/how-to-create-a-wallet/index.html +++ b/ko/wallet/manual/how-to-create-a-wallet/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ 2_1_4

    노트

    니모닉을 유출할 경우 계정에 있는 자산을 잃게 될 수 있습니다. 니모닉을 분실할 경우 계정을 복구할 수 없습니다. 따라서 니모닉을 안전하게 보관해야 합니다. 단어의 철자는 올바른지 단어의 순서가 올바른지 확인합니다.

    Create a wallet by importing existing mnemonic phrase

    Step 1: 지갑의 첫 실행 화면에서 Import Wallet 버튼을 클릭합니다.

    Step 2: 가지고 있는 니모닉을 입력하고 Next 버튼을 클릭합니다.

    2_2_1 2_2_2

    Step 3: 비밀번호를 생성하고 Create a Wallet 버튼을 클릭합니다.

    Step 4: 다음과 같이 환영 알림창이 나타났다면 지갑 생성이 완료된 것 입니다.

    2_2_3 2_2_4

    - + \ No newline at end of file diff --git a/ko/wallet/manual/how-to-create-an-account/index.html b/ko/wallet/manual/how-to-create-an-account/index.html index 423fc72a8..61ebf1328 100644 --- a/ko/wallet/manual/how-to-create-an-account/index.html +++ b/ko/wallet/manual/how-to-create-an-account/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ frame4

    노트

    HD Path 는 하나의 니모닉으로 부터 여러 개의 계정을 생성하기 위해 생겨난 개념입니다. 같은 니모닉이라도 HD Path가 다르면 다른 계정 주소가 생성됩니다. 이처럼 체인마다 각각 다른 HD Path를 표준으로 사용하기 때문에 같은 니모닉으로 부터 다른 계정 주소들이 생성되는 것입니다.

    하지만 한 체인내에서 여러 가지 HD Path를 혼재하여 사용하는 경우가 있습니다. 예를 들어 Celo의 경우, Celo의 기본 HD Path가 존재하지만, Ethereum HD Path를 사용하는 Metamask와 같은 지갑으로 Celo를 이용하는 사용자들이 있습니다. 따라서 WELLDONE Wallet은 이러한 다양한 경우들을 지원하기 위해 체인내에서 사용자가 직접 HD Path를 선택할 수 있도록 지원합니다. 또한 HD Path의 가장 마지막 항목인 Index도 조절할 수 있도록 지원합니다. HD Path를 조정해서 추가하고자 했던 계정의 주소를 확인합니다.

    Create an account with Private Key

    Step 1: 추가하고 싶은 체인을 선택합니다.

    Step 2: Import Private Key(이미 사용하던 계정을 Private Key로 등록해서 사용하고 싶은 경우) 버튼을 클릭합니다.

    frame1 frame5

    Step 3: 지갑에서 사용할 별칭인 계정 이름을 생성합니다. Private Key를 입력한 뒤 생성된 계정 주소를 확인하고 Add Account 버튼을 클릭합니다.

    frame6

    Create an Account in NEAR

    대부분의 체인은 위의 방법을 통해 계정을 생성할 수 있지만, NEAR의 경우에는 Keystore를 사용하여 계정을 생성할 때 몇 가지 과정이 추가로 필요합니다.

    Step 1: Address에 연결된 기존 계정이 없다면 Create New 버튼을 클릭하여 AccountID를 입력합니다. 테스트넷 계정을 생성할 경우에는 .testnet을, 메인넷 계정을 생성할 경우에는 .near를 선택합니다.

    3_3_1 3_3_2

    노트

    NEAR의 경우 human-readable 한 ID를 갖기 때문에 중복되지 않는 Account ID 값을 입력해줘야 하고, 해당 계정을 활성화하기 위해서는 일정량의 NEAR 토큰을 해당 계정으로 보내야 합니다. 다음 링크에서 NEAR 테스트넷 faucet을 요청할 수 있습니다.

    Step 2: 계정에 토큰이 들어온 것이 확인되면 아래와 같이 Create New 버튼이 활성화 됩니다. 버튼을 클릭하면 NEAR 계정이 생성됩니다.

    3_3_3

    노트

    처음 계정을 활성화하기 위해 보내는 토큰 이외에 해당 계정을 사용해서 컨트랙트를 배포하고 트랜잭션을 실행하기 위해서는 일정량의 토큰이 필요합니다. 테스트넷 계정의 경우 지갑 내의 FAUCET 탭에서 NEAR 테스트넷 faucet을 요청할 수 있습니다.

    - + \ No newline at end of file diff --git a/ko/wallet/manual/how-to-export-a-private-key/index.html b/ko/wallet/manual/how-to-export-a-private-key/index.html index 7325481f2..d4df4e422 100644 --- a/ko/wallet/manual/how-to-export-a-private-key/index.html +++ b/ko/wallet/manual/how-to-export-a-private-key/index.html @@ -8,13 +8,13 @@ - +

    How to Export a Private Key

    Step 1: 계정 페이지에서 계정 이름 옆 더보기 아이콘을 클릭해 계정 상세 페이지에 들어갑니다.

    Step 2: 계정 상세 페이지에서 보기 버튼을 클릭합니다.

    8_18_2

    Step 3: Private Key를 보기위해 비밀번호를 입력해 계정의 소유를 확인합니다.

    Step 4: 비밀번호를 입력하고 나면 Private Key가 보입니다. 복사 버튼을 클릭해 복사할 수 있습니다.

    8_38_4
    - + \ No newline at end of file diff --git a/ko/wallet/manual/how-to-install/index.html b/ko/wallet/manual/how-to-install/index.html index 4ecbacfc5..69b5125e7 100644 --- a/ko/wallet/manual/how-to-install/index.html +++ b/ko/wallet/manual/how-to-install/index.html @@ -8,13 +8,13 @@ - +

    How to install

    Step 1: Chrome 웹 스토어에서 WELLDONE Extension Wallet를 찾아 선택합니다.

    1_1

    Step 2: Chrome에 추가 버튼을 클릭합니다.

    1_2

    Step 3: 확장 프로그램을 사용하려면 주소 표시줄 오른쪽에 있는 아이콘을 클릭합니다.

    1_3

    핀 버튼을 눌러 WELLDONE Wallet을 고정해두면 더 편하게 접근할 수 있습니다.

    - + \ No newline at end of file diff --git a/ko/wallet/manual/how-to-manage-a-network/index.html b/ko/wallet/manual/how-to-manage-a-network/index.html index fa96517e4..336f0edab 100644 --- a/ko/wallet/manual/how-to-manage-a-network/index.html +++ b/ko/wallet/manual/how-to-manage-a-network/index.html @@ -8,13 +8,13 @@ - +

    How to Manage a Network

    Switch Network

    Step 1: 계정 페이지에서 네트워크 영역을 클릭하면 네트워크 선택창이 나타납니다.

    Step 2: 변경하고자 하는 네트워크를 선택합니다.

    6_16_2

    Add Network

    지갑에서 네트워크를 추가하는 방법은 두가지가 있습니다. 1) WELLDONE Wallet에서 제공하는 Add Chain 사이트를 사용하는 방법2) 직접 네트워크 정보를 입력해 추가하는 방법이 있습니다.

    Using the Add Chain Site

    Add Chain 사이트를 이용하면 직접 네트워크 정보를 입력할 필요 없이 간편하게 지갑에 네트워크를 추가할 수 있습니다. Add Chain 사이트를 사용하는 자세한 메뉴얼은 다음 링크를 참고해주세요.

    Add Network in WELLDONE Wallet directly

    Step 1: 네트워크 선택창에서 Add Network 버튼을 클릭합니다.

    Step 2: 네트워크 정보를 입력하고 Add 버튼을 클릭합니다. 직접 입력하기 어렵다면 멀티체인 네트워크 정보를 자동으로 채워주는 Add Chain을 이용하시길 추천드립니다.

    6_36_4
    노트

    지갑에서 기본적으로 제공하는 네트워크는 수정 및 삭제가 불가능하지만 사용자가 직접 추가한 네트워크는 언제든지 수정 및 삭제할 수 있습니다.

    Edit Network

    Step 1: 네트워크 선택창에서 수정하려는 네트워크의 편집 아이콘을 클릭합니다.

    Step 2: 네트워크 이름, 화폐 심볼, 익스플로러 링크를 수정하고 Save 버튼을 클릭하면 네트워크 정보가 수정됩니다. 체인 아이디와 Rpc url을 변경하고자 한다면 해당 네트워크를 삭제하고 새로운 네트워크를 등록하시면 됩니다.

    6_56_6

    Delete Network

    Step 1: 네트워크 선택창에서 삭제하려는 네트워크의 삭제 아이콘을 클릭합니다.

    Step 2: 다시 한번 확인 후 빨간색 삭제 아이콘을 클릭하면 네트워크가 삭제됩니다.

    6_76_8
    - + \ No newline at end of file diff --git a/ko/wallet/manual/how-to-send-tokens/index.html b/ko/wallet/manual/how-to-send-tokens/index.html index c002ed11e..36ad3cb08 100644 --- a/ko/wallet/manual/how-to-send-tokens/index.html +++ b/ko/wallet/manual/how-to-send-tokens/index.html @@ -8,7 +8,7 @@ - + @@ -17,7 +17,7 @@ 4_2

    Step 3: 계정 페이지에서 전송하고자하는 토큰의 전송 아이콘을 클릭합니다.

    Step 4: 전송 페이지에서 전송할 토큰 수량과 받는 계정 주소를 입력하면 예상 수수료가 표시됩니다. 수수료, 체인, 네트워크 정보 및 토큰 정보를 다시 한번 확인하고 Send Token 버튼을 클릭해 토큰을 전송합니다.

    4_3 4_4

    Step 5: 토큰 전송이 마무리되면 다음 화면에서 익스플로러 아이콘을 클릭해 방금 전송한 토큰 전송 트랜잭션 상태를 확인할 수 있습니다.

    4_5 4_6

    - + \ No newline at end of file diff --git a/ko/wallet/manual/how-to-use-bridges/index.html b/ko/wallet/manual/how-to-use-bridges/index.html index a94b6899e..6bc8355a7 100644 --- a/ko/wallet/manual/how-to-use-bridges/index.html +++ b/ko/wallet/manual/how-to-use-bridges/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/wallet/manual/how-to-use-bridges/neon-portal/index.html b/ko/wallet/manual/how-to-use-bridges/neon-portal/index.html index ef50b14bc..9d0342644 100644 --- a/ko/wallet/manual/how-to-use-bridges/neon-portal/index.html +++ b/ko/wallet/manual/how-to-use-bridges/neon-portal/index.html @@ -8,13 +8,13 @@ - +

    Neon Portal

    NEON은 Solana의 EVM 프로젝트입니다. Neon Portal은 Neon과 Solana 사이의 브릿지입니다. Neon Portal을 이용해 Solana와 Neon간 자산을 이동할 수 있습니다.

    브릿지를 이용하려는 계정 페이지로 이동합니다.

    Step 1: 체인을 선택합니다.

    Step 2: 계정 선택창에서 이동하고자 하는 계정을 선택합니다.

    5_15_2

    Step 3: 계정 페이지에서 브릿지 전송하려는 토큰을 클릭합니다.

    Step 4: 토큰 창에서 Bridge 버튼을 클릭합니다.

    5_35_4

    Step 5: 브릿지 페이지에서 브릿지를 선택하고 Next 버튼을 클릭합니다.

    Step 6: 전송할 토큰 수량과 받는 계정 주소를 입력하면 예상 수수료가 표시됩니다. 수수료, 보내는 쪽 체인, 받는 쪽 체인 및 토큰을 다시 한번 확인하고 Send Token 버튼을 클릭해 브릿지 전송합니다.

    노트

    잘못된 주소로 브릿지 전송하는 상황을 막기 위해 WELLDONE Wallet에서는 지갑 내 계정끼리만 브릿지 이용이 가능합니다. 따라서 브릿지를 이용하려면 받는 쪽 체인에서 계정을 생성해야 합니다. Neon Portal은 현재 Solana devnet과 Neon devnet에서 이용 가능합니다.

    5_55_6

    Step 7: 브릿지 전송이 마무리되면 다음 화면에서 익스플로러 아이콘을 클릭해 방금 전송한 전송 트랜잭션 상태를 확인할 수 있습니다.

    5_7

    5_8

    - + \ No newline at end of file diff --git a/ko/wallet/manual/index.html b/ko/wallet/manual/index.html index 34506bc63..ae8b3592b 100644 --- a/ko/wallet/manual/index.html +++ b/ko/wallet/manual/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/ko/wallet/zkWallet/get-account/index.html b/ko/wallet/zkWallet/get-account/index.html index 6cc335add..c4628f3cf 100644 --- a/ko/wallet/zkWallet/get-account/index.html +++ b/ko/wallet/zkWallet/get-account/index.html @@ -8,7 +8,7 @@ - + @@ -66,7 +66,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/zkWallet/index.html b/ko/wallet/zkWallet/index.html index 12e8f3a6e..f47d592a2 100644 --- a/ko/wallet/zkWallet/index.html +++ b/ko/wallet/zkWallet/index.html @@ -8,13 +8,13 @@ - +

    zkWallet

    Prerequisites
    • 현재는 Alpha 버전으로 Dapp과의 원활한 인터랙션을 위해 여기 내용에 따라 zkWallet에 어카운트를 만들고 로그인을 하고나서 진행 해야 합니다. 불편을 드려 죄송합니다.

    이 섹션에서는 개발자들이 자신의 분산 애플리케이션(DApp)과 WELLDONE zkWallet을 효과적으로 연동하는 방법에 대한 개요를 제공합니다. zkWallet은 사용자가 Web2 자격 증명을 사용하여 블록체인 서비스에 접근할 수 있게 하는 혁신적인 웹 지갑입니다. 이 연동을 통해 사용자는 블록체인 기능을 더 쉽고 안전하게 이용할 수 있습니다.

    더 자세한 정보와 단계별 지침은 WELLDONE zkWallet 문서를 참조하세요.

    process
    - + \ No newline at end of file diff --git a/ko/wallet/zkWallet/send-transaction/index.html b/ko/wallet/zkWallet/send-transaction/index.html index 1eae97766..e3266032c 100644 --- a/ko/wallet/zkWallet/send-transaction/index.html +++ b/ko/wallet/zkWallet/send-transaction/index.html @@ -8,7 +8,7 @@ - + @@ -108,7 +108,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/ko/wallet/zkWallet/sign-transaction/index.html b/ko/wallet/zkWallet/sign-transaction/index.html index 4469d00d0..e1bc6fbbb 100644 --- a/ko/wallet/zkWallet/sign-transaction/index.html +++ b/ko/wallet/zkWallet/sign-transaction/index.html @@ -8,7 +8,7 @@ - + @@ -170,7 +170,7 @@ } }
    결과
    Loading...
    - + \ No newline at end of file diff --git a/provider-api/index.html b/provider-api/index.html index 2196d3835..2eba02cd2 100644 --- a/provider-api/index.html +++ b/provider-api/index.html @@ -8,13 +8,13 @@ - +

    Provider API

    info

    We recommend you go through the basics before reading the material.

    WELLDONE Wallet injects a global API known as window.dapp into the website that you visit. You may use the window.dapp API to request a user's account from a website, query data from a blockchain to which the user is linked, and let the user sign messages and transactions.

    If you're wondering about how you can send requests to many chains with WELLDONE Wallet and how we support a multichain environment, check out the documentation below.

    - + \ No newline at end of file diff --git a/search/index.html b/search/index.html index b57401ec1..6f02f1095 100644 --- a/search/index.html +++ b/search/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/sending-transaction/index.html b/sending-transaction/index.html index 0893849ed..008661550 100644 --- a/sending-transaction/index.html +++ b/sending-transaction/index.html @@ -8,13 +8,13 @@ - +

    Sending Transactions

    note

    The undeniable but fundamental activity in the web3 universe is Sending Transactions. This action can invoke simple token transfers, the creation of new smart contracts, or change the status of the blockchain in a variety of ways. Sending Transactions can be largely divided into two stages: transaction signing and transaction sending, and WELLDONE Wallet can sign and send transactions at once using the dapp:signAndSendTransaction method.

    CHAIN NAME and HEX_STRING_TX_DATA are two parameters for dapp:signAndSendTransaction. CHAIN_NAME is the name of the network to which you wish to add, and HEX_STRING_TX_DATA is the value of converting the transaction to a HEX string type. Because a transaction format differs by networks, WELLDONE Wallet executes the transaction by taking the input argument in hex string type then translate it to compatible to the targeted network.

    info

    You can put the transaction objects as they are in EVM networks.

    type CHAIN_NAME =
    | 'aptos'
    | 'celestia'
    | 'celo'
    | 'cosmos'
    | 'ethereum'
    | 'injective'
    | 'juno'
    | 'klaytn'
    | 'near'
    | 'neon'
    | 'neutron'
    | 'solana'
    | 'sui';
    type HEX_STRING_TX_DATA = 'string';

    const response = await window.dapp.request(CHAIN_NAME, {
    method: 'dapp:signAndSendTransaction',
    params: [HEX_STRING_TX_DATA],
    });

    There is a difference in how to construct HEX_STRING_TX_DATA since each chain's transaction format is different, even though all chains use the same method dapp:signAndSendTransaction. Each chain-specific section below provides details on how to send requests by the chain with simple token transfer transaction example.

    - + \ No newline at end of file diff --git a/tutorials/aptos-account/index.html b/tutorials/aptos-account/index.html index 5370da621..a634e205b 100644 --- a/tutorials/aptos-account/index.html +++ b/tutorials/aptos-account/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/tutorials/aptos-account/object-model/index.html b/tutorials/aptos-account/object-model/index.html index 8d04de7aa..a3c837114 100644 --- a/tutorials/aptos-account/object-model/index.html +++ b/tutorials/aptos-account/object-model/index.html @@ -8,13 +8,13 @@ - +

    Object Model

    December 8, 2023
    Aladeenb (LAY)
    Blockchain Engineer, Townesquare

    Introduction

    Object model introduces a comprehensive capability framework that facilitates control over resources, ownership management, and event emission, which in return enhances the functionality and flexibility of on-chain interactions.

    The primary motivation behind the object model is to enable Move to represent a set of different complex types as a one collection of resources stored within a single address.

    By organizing resources in this manner, objects can encompass various elements such as NFTs, tokens, and specialized data structures like player objects within a game. The model offers several advantages, including improved type-safety, enhanced data access, and the ability to emit events directly from objects.

    The existing Aptos data model relies on the store ability within Move, allowing structs to be stored in global storage. However, this approach has limitations:

    • Limited data accessibility: Data can be placed within user-defined resources, making it inaccessible or violating the expected behavior for that data. This can cause confusion for users and creators.

    • Mixing data types: Different data types can be stored in a single data structure using the “any” type, but this incurs additional costs due to deserialization. It also introduces confusion when developers expect a specific field to represent a particular type.

    • Lack of data composability: Move currently has restrictions on recursive data structures, which limits the composability of data. Moreover, true recursive data structures can lead to security vulnerabilities.

    • Complex data referencing: Referencing existing data within entry functions requires substantial code. Supporting unique keys for string validation becomes intricate, hindering development efficiency.

    • Limited event emission: Events can only be emitted from an account, not directly from associated data, leading to disjointed event tracking.

    • Costly transfer logic: Transferring logic is restricted to module-specific APIs, resulting in unnecessary cost overhead and resource loading for both senders and receivers.

    Analyzing object.move

    Let’s delve into the composition of the object model: The core structure compromised of four components.

    struct `ObjectCore` has key {
    guid_creation_num: u64,
    owner: address,
    allow_ungated_transfer: bool,
    transfer_events: event::EventHandle<TransferEvent>,
    }
    • guid_creation_num: A distinctive identifier.
    • owner: The owner's address (whether pertaining to an object or an account).
    • allow_ungated_transfer: A boolean variable enabling or disabling the object's transferability. Visualize this variable as a gate, allowing the execution of transfers when in the open (true) state, and restricting them when closed (false).
    • transfer_events: The transfer event that is emitted whenever a transfer takes place.

    These variables represent the object’s uniqueness, ownership details, transferability status, and discoverability, respectively. By already encompassing the core structure, the principles of scarcity within the Move framework is effectively validated.

    [Scarcity refers to the limited availability of a particular object or asset within a given system.

    Firstly, guid_creation_num assigned to each object ensures that no two entities share the same identity. This uniqueness fosters a sense of rarity and exclusivity, as each object can be distinctly identified and differentiated from others.

    Secondly, owner address associated with the object or account further enhances scarcity. By explicitly designating an owner, it establishes a sense of ownership and control over the object, limiting its availability to a specific individual or entity. This owner-based restriction helps maintain scarcity by ensuring that the transfer of ownership is intentional and controlled.

    allow_ungated_transfer, acting as a gate for enabling or disabling transfer, adds an additional layer of scarcity enforcement. By providing the ability to regulate and restrict transfers, the model empowers owners to determine when and to whom an object can be transferred. This mechanism prevents unauthorized or undesired transfers, reinforcing the scarcity of the object by granting ownership control.

    Finally, transfer_events, emitted whenever a transfer occurs, contributes to the overall discoverability and transparency of the system. This event serves as an acknowledgment and record of the transfer, allowing participants to be aware of ownership changes and facilitating the tracking of object movement. By providing visibility into the transfer process, the model ensures that the scarcity of an object is evident and verifiable.]

    These properties define the object model:

    • simplified storage interface.
    • data and ownership model are globally accessible.
    • extensible programming model.
    • simplified storage interface: the object model supports a heterogeneous collection of resources to be stored together, providing a common core data layer for different data types. This means that different data types can be stored together.

    The purpose of this feature is to enable data types to share common functionality and resources while still allowing for richer extensions specific to each data type. For example, the core data layer may contain shared properties or attributes that are common to all objects, while the extensions may contain additional properties or behaviors specific to each object type (e.g., a concert ticket object may have additional properties related to the concert event).

    In order to simplifies the storage and retrieval process, resources within an object share the same storage. #[resource_group(scope = global)]

    This also enables the sharing of common data structures or core data layers among different resource types. For example, all resources within an object can share a common set of tokens or basic data fields. #[resource_group_member(group = aptos_framework::object::ObjectGroup)]

    The Object<phantom T> struct allows for the storage and retrieval of objects of different types in a unified manner, providing a simplified interface to interact with the objects stored in the Move storage.

    • data and ownership model are globally accessible. Objects and their associated data can be accessed and managed from anywhere since they are not confined to specific scopes or modules but are accessible globally.

    Structs

    • ObjectCore: This struct defines the core properties of an object, including the owner, transferability, and events associated with the object. It represents the ownership and data model of an object.

    • Object<phantom T>: This struct represents a pointer to an object. It holds the address of the object and allows access to the underlying data. It represents the data model of an object.

    • ConstructorRef, DeleteRef, ExtendRef, TransferRef, LinearTransferRef, DeriveRef: These structs represent references or handles to perform various operations on objects, such as creation, deletion, extension, transfer, and derivation. They provide access to the ownership and data model of an object.

    Functions

    • create_named_object, create_object_from_account, generate_delete_ref, generate_extend_ref, etc.: These functions manipulate the object model by creating objects, generating references, and performing operations on objects. They interact with the data and ownership model of objects.

    • This structure promotes creating and managing objects with a globally accessible data and ownership model, enabling various operations on objects and supporting event handling.

    • extensible programming model: This refers to the ability to extend and customize the behavior of objects without modifying their original implementation. It allows developers to add new functionality, modify existing behavior, or specialize objects for specific use cases without directly modifying the underlying code.

    These structs and functions provide mechanisms to create, configure, extend, transfer, derive, convert, and delete objects, allowing for individualization of user applications and leveraging the core framework.

    note

    as a general rule, input validation, access control, appropriate event handling, and unit testing are effective to identify and potential security vulnerabilities.

    Implementation example — Ticket as Object

    https://github.com/Aladeenb/simple-ticket

    This module represents a simple ticket implementation of the object model:

    • A ticket represents an object, it consists of 2 variables, price and seat.
    • A seat represents another object, it has 2 variables as well, category and price_modifier, and it can be upgraded.
    • click for more details
    note

    TODO: Tickets can be transferred; add a function for that.


    Object model implementations within Aptos Framework:

    The following implementations will be explained in future articles:

    Aptos Token v2: an object-based token model

    Aptos Fungible Asset: an object-based fungible asset model

    Primary Fungible Store: a support module for managing and transferring fungible assets

    - + \ No newline at end of file diff --git a/tutorials/aptos-account/resource-account/index.html b/tutorials/aptos-account/resource-account/index.html index ae91fad89..23695d8a8 100644 --- a/tutorials/aptos-account/resource-account/index.html +++ b/tutorials/aptos-account/resource-account/index.html @@ -8,13 +8,13 @@ - +

    Resource Account

    December 6, 2023
    Sooyoung Hyun
    Lead Software Engineer, DSRV

    Introduction

    This tutorial explores one of the Aptos account models, the resource account. It is based on content from the official Aptos documentation, supplemented with practical exercises for better understanding.

    In Ethereum, assets (e.g., tokens) are managed through smart contracts. In contrast, Aptos allows direct management of these assets as 'resources' within user accounts. This structure necessitates resource accounts in Aptos. Resource accounts operate independently from user accounts, facilitating resource management and access control. This feature is vital for supporting complex and diverse blockchain applications in Aptos, ensuring secure and efficient resource management.

    Resource Account

    Creating a Resource Account

    First, a regular user account in Aptos is created using the WELLDONE Wallet.

    wallet-create-account

    Then, using the Aptos CLI in the terminal, a resource account with seed 1 is created. The process involves cloning the aptos-core repository and proceeding with the creation of simple_exam folders and files at the following path:

    ./aptos-core/aptos-move/move-examples/simple_exam

    The user account's private key extracted from the wallet is used to set up the account in Aptos CLI.

    wallet-export-pk1wallet-export-pk2
    > aptos init --private-key <PRIVATE_KEY>
    wallet-import

    Next, the resource account is created using this account. Since a resource account is created with a hash of a specific account address and seed, only one resource account can be created per account address and seed.

    creat-resource-account

    Coins are then transferred to the newly created resource account through the faucet.

    fund-with-faucet

    Using an explorer, the newly created resource account address is checked, revealing that the authentication key is still with the original user account, indicating that the resource account is still under the control of the user account.

    explorer-check-authkey

    Publishing a Package

    The tutorial now moves to publishing a package to the resource account.

    simple_exam
    └── .aptos
    └── config.yaml
    └── sources
    └── simple_example.move
    └── Move.toml
    // simple_example.move

    module simple_example::tutorial {
    use aptos_framework::resource_account;

    public entry fun retrieve_resource_account(resource_signer: &signer){
    resource_account::retrieve_resource_account_cap(resource_signer, @source_addr);
    }
    }

    // Move.toml

    [package]
    name = "Examples"
    version = "0.0.0"

    [addresses]
    source_addr = 'b6936414e726f849b4673a08ac35ba181fa991056d35a9bafa2e4b9395ea8581'
    resource_address = 'cc424539f912acb25003b831ee2033d28d1a4e64690038b9d726f702fdd7e994'
    simple_example = 'cc424539f912acb25003b831ee2033d28d1a4e64690038b9d726f702fdd7e994'

    [dependencies]
    AptosFramework = { local = "../../framework/aptos-framework" }

    // .aptos/config.yaml

    ---
    profiles:
    default:
    private_key: "<PRIVATE KEY>"
    public_key: "0x3637f1b86e33b47557f5941a3414bee8e2f10d14dd4ca0967a0c75eabfbedbee"
    account: b6936414e726f849b4673a08ac35ba181fa991056d35a9bafa2e4b9395ea8581
    rest_url: "https://fullnode.testnet.aptoslabs.com"
    faucet_url: "https://faucet.testnet.aptoslabs.com"
    resource:
    private_key: "<PRIVATE KEY>"
    public_key: "0x3637f1b86e33b47557f5941a3414bee8e2f10d14dd4ca0967a0c75eabfbedbee"
    account: cc424539f912acb25003b831ee2033d28d1a4e64690038b9d726f702fdd7e994
    rest_url: "https://fullnode.testnet.aptoslabs.com"
    faucet_url: "https://faucet.testnet.aptoslabs.com"

    The code defines the retrieve_resource_account function within the simple_example::tutorial module. This function retrieves the Signer Capability of a resource account. Signer Capability allows delegation of specific account permissions to another account, enabling the resource account or other accounts to perform necessary actions. This plays a crucial role, especially when a resource account performs independent operations.

    • resource_signer: &signer: This parameter is a signer object passed by reference (&). It utilizes the authority of this signer during the function call.
    • resource_account::retrieve_resource_account_cap(...): This function retrieves the Signer Capability of a resource account. resource_signer here passes the aforementioned signer object, and @source_addr represents the address of the user account that created the resource account.

    The following command publishes the package to the resource account.

    publish-package

    Once published, the status can be checked via the explorer. It can be seen that the package is properly deployed and the authentication key still exists. The function required to change the authentication key to 0 and make the resource account independent is the resource_account::retrieve_resource_account_cap function just deployed.

    explorer-check-moduleexplorer-check-authkey

    Rotating the Authentication Key

    The resource_account::retrieve_resource_account_cap function is called to remove the authentication key that grants authority to the resource account.

    move-function-call

    Checking the explorer, it can be seen that the authentication key is changed to 0, making the resource account independent.

    explorer-check-authkey

    Let's delve deeper into the resource account.

    When a resource account is created, a Signer Capability is generated, enabling the signing capabilities of that resource account. This allows a specific resource account to sign transactions or manipulate assets owned by the account.

    In the example provided, when the resource account calls the retrieve_resource_account_cap function, it retrieves the associated Signer Capability and rotates the account's authentication key to 0x0. This process ensures that the account cannot be accessed without the Signer Capability, enhancing the security of the resource account and making its management and usage safer. (It's also possible to rotate the key at the time of package deployment using the init_module function.)

    Below is the code for this function.

        public fun retrieve_resource_account_cap(
    resource: &signer,
    source_addr: address,
    ): account::SignerCapability acquires Container {
    assert!(exists<Container>(source_addr), error::not_found(ECONTAINER_NOT_PUBLISHED));

    let resource_addr = signer::address_of(resource);
    let (resource_signer_cap, empty_container) = {
    let container = borrow_global_mut<Container>(source_addr);
    assert!(simple_map::contains_key(&container.store, &resource_addr), error::invalid_argument(EUNAUTHORIZED_NOT_OWNER));
    let (_resource_addr, signer_cap) = simple_map::remove(&mut container.store, &resource_addr);
    (signer_cap, simple_map::length(&container.store) == 0)
    };

    if (empty_container) {
    let container = move_from(source_addr);
    let Container { store } = container;
    simple_map::destroy_empty(store);
    };

    account::rotate_authentication_key_internal(resource, ZERO_AUTH_KEY);
    resource_signer_cap
    }

    The function flow first checks for the existence of a 'Container' resource at the specified source address (source_addr). The 'Container' is a structure used to store the 'SignerCapability' of a resource account. Using the address of the resource account (resource_addr), the function retrieves this 'SignerCapability' and returns it.

    A crucial part of this process is rotating the resource account's authentication key to 'ZERO_AUTH_KEY' after retrieving the 'SignerCapability'. This rotation makes the resource account inaccessible from the outside, thereby enhancing its security.

    In summary, calling this function retrieves the Signer Capability of the given resource account and rotates its authentication key to zero, ensuring safe management of transactions related to the resource account.

    Additionally, the create_resource_account_and_publish_package method from the Aptos official documentation can be used to create a resource account while simultaneously rotating its authentication key and deploying a package.

    From the aptos-core's move-examples, the 2-Using-Resource-Account will be explored. Since seed 1 was previously used, this time a resource account is created with seed 2, and a package is deployed.

    create_resource_account_and_publish_package

    Upon inspecting the newly created resource account in the explorer, it can be observed that the package has been deployed and the authentication key has been rotated to 0.

    explorer-check-codeexplorer-check-authkey

    Below is the code for this function.

    /// Creates a new resource account, publishes the package under this account transaction under
    /// this account and leaves the signer cap readily available for pickup.
    public entry fun create_resource_account_and_publish_package(
    origin: &signer,
    seed: vector<u8>,
    metadata_serialized: vector<u8>,
    code: vector<vector<u8>>,
    ) acquires Container {
    let (resource, resource_signer_cap) = account::create_resource_account(origin, seed);
    aptos_framework::code::publish_package_txn(&resource, metadata_serialized, code);
    rotate_account_authentication_key_and_store_capability(
    origin,
    resource,
    resource_signer_cap,
    ZERO_AUTH_KEY,
    );
    }

    fun rotate_account_authentication_key_and_store_capability(
    origin: &signer,
    resource: signer,
    resource_signer_cap: account::SignerCapability,
    optional_auth_key: vector<u8>,
    ) acquires Container {
    let origin_addr = signer::address_of(origin);
    if (!exists<Container>(origin_addr)) {
    move_to(origin, Container { store: simple_map::create() })
    };

    let container = borrow_global_mut<Container>(origin_addr);
    let resource_addr = signer::address_of(&resource);
    simple_map::add(&mut container.store, resource_addr, resource_signer_cap);

    let auth_key = if (vector::is_empty(&optional_auth_key)) {
    account::get_authentication_key(origin_addr)
    } else {
    optional_auth_key
    };
    account::rotate_authentication_key_internal(&resource, auth_key);
    }

    This method creates a resource account from the original account (origin) and deploys a package under this account. A Signer Capability (resource_signer_cap) associated with the resource account is generated, granting it the authority to autonomously sign transactions. The rotate_account_authentication_key_and_store_capability function rotates the authentication key of the resource account and securely stores the Signer Capability.

    Conclusion

    This tutorial has covered the creation and management of resource accounts in Aptos, as well as effective methods for deploying packages. It is hoped that this will provide a deeper understanding of resource accounts in Aptos.


    Reference

    https://aptos.dev/

    https://github.com/aptos-labs/aptos-core

    - + \ No newline at end of file diff --git a/tutorials/aptos-account/standard-account/index.html b/tutorials/aptos-account/standard-account/index.html index 413123edb..1adfdc20b 100644 --- a/tutorials/aptos-account/standard-account/index.html +++ b/tutorials/aptos-account/standard-account/index.html @@ -8,13 +8,13 @@ - +

    Standard Account

    November 29, 2023
    Sooyoung Hyun
    Lead Software Engineer, DSRV

    Introduction

    In the Aptos blockchain, the account model is a key element for managing users' digital assets and smart contracts. There are three types of accounts in Aptos: standard accounts with typical key pairs, resource accounts which are standalone accounts without private keys used by developers, and objects which are complex sets of resources stored at a single address. Each of these types of accounts has its unique characteristics and use cases. In this article, we will primarily discuss the special features of the Standard Account.

    Prerequisites
    • Basic understanding of blockchain ecosystem.

    Standard Account

    Account Creation and Management

    In the Aptos blockchain, the state of each account is composed of two main elements: Move modules and Move resources.

    • Move Modules: These include code, such as declarations of types or procedures, but do not contain data. Move modules define the rules for updating the global state of the Aptos blockchain.
    • Move Resources: On the other hand, Move resources contain data but no code. Each value of Move resources is of a type declared in some module published on the Aptos blockchain.

    Accounts in Aptos are created on-chain, and users can create new accounts through wallets. However, actual activation on-chain requires a separate transaction. As seen in the images below, an account is created in the wallet, but it is not found in the explorer.

    wallet-create-accountexplorer-no-account

    Here, we use a faucet for account activation. This allows users to activate their accounts on-chain and start transactions on the actual Aptos network. The Aptos official documentation describes this as follows:

    note

    The Aptos framework supports implicitly creating accounts when transferring Aptos coin via aptos_account::transfer or explicitly via aptos_account::create_account.

    wallet-faucetexplorer-account-info

    An account activated through the faucet can be seen in the Aptos Explorer with key information, including the account address, sequence number, and authentication key.

    The guid is a globally unique identifier generated based on the sender's address and counter, while the account's sequence_number indicates the number of transactions submitted and committed on-chain from that account. We will explore authentication_key in more detail.

    Authentication Key

    The authentication key is an important element related to account security. This key is set at the time of account creation and can be changed as needed. That is, users can change the authentication key periodically for security reasons. If the private key of an account has been exposed or is likely to have been exposed, you can safely protect the account by changing the private key and authentication key while maintaining the original account address.

    note

    In Aptos, an authentication key is created from the public key in the private-public key pair, mapped to the account address, and then mapped on-chain, allowing verification of the account and authentication key.

    Let's see an example. We will change the authentication key for the account we just created.

    key-rotate

    The rotate-key feature of aptos-cli was utilized to change the authentication key. Subsequently, through the explorer, it was confirmed that the authentication key for the original account, 0x28a0…2c1, had been changed.

    change-key-info

    Since the previous key, prior to the change, is stored in the wallet, if a transaction is signed and sent using this old key, it will naturally fail.

    fail-tx

    Let's examine an example from the code in the aptos-core repository.

    This code utilizes the Aptos blockchain network to create two new accounts and then activates them using the faucet, followed by rotating the authentication key of one of the accounts. The primary components and process used are as follows:

    The AptosAccount class is used to create two new accounts named Alice and Bob. Then, the FaucetClient is employed to transfer funds to these two accounts.

    // :!:>create_accounts
    const alice = new AptosAccount();
    const bob = new AptosAccount(); // <:!:create_accounts

    await faucetClient.fundAccount(alice.address(), 1 * Math.pow(10, APTOS_COIN_DECIMALS));
    await faucetClient.fundAccount(bob.address(), 1 * Math.pow(10, APTOS_COIN_DECIMALS));

    Alice's authentication key is changed to Bob's secret key.

    const response = await provider.aptosClient.rotateAuthKeyEd25519(alice, bob.signingKey.secretKey); // <:!:rotate_key

    After the authentication key is changed, a new instance of Alice's account is created using the new private key and the existing address of Alice

    // We must create a new instance of AptosAccount because the private key has changed.
    const aliceNew = new AptosAccount(
    bob.signingKey.secretKey,
    alice.address(), // NOTE: Without this argument, this would be bob, not aliceNew. You must specify the address since the private key matches multiple accounts now
    );

    Below are the execution results. It can be observed that Alice's authentication key has been changed to Bob's.

    ts-example-key-rotation

    Multisig Account

    In the Aptos blockchain, the Multisig (Multisignature) feature is a crucial mechanism for managing transactions that require the approval of multiple entities (owners). This feature enhances security and is especially useful in situations requiring joint decisions. For instance, it can be used in organizational fund management or executing significant contracts that require the approval of multiple stakeholders.

    We will explore how to implement a multisig account using the multisig_account.ts script. This example covers the creation of a multisig account, addition and removal of administrators, and changing the signature threshold settings.

    Here is a scenario and an explanation of the main functions in the example code.

    Aptos accounts are created for three owners (owner1, owner2, owner3), and funds are provided to each account.

    const owner1 = new AptosAccount();
    const owner2 = new AptosAccount();
    const owner3 = new AptosAccount();
    await faucetClient.fundAccount(owner1.address(), 100_000_000);
    await faucetClient.fundAccount(owner2.address(), 100_000_000);
    await faucetClient.fundAccount(owner3.address(), 100_000_000);

    Multisig Account Setup (2-of-3): A 2-of-3 multisig account is created using owner1. This type of account requires the approval of two out of three owners.

    const payload: Gen.ViewRequest = {
    function: "0x1::multisig_account::get_next_multisig_account_address",
    arguments: [owner1.address().hex()],
    };
    const multisigAddress = (await client.view(payload))[0] as string;

    // Create the multisig account with 3 owners and a signature threshold of 2.
    const createMultisig = await client.generateTransaction(owner1.address(), {
    function: "0x1::multisig_account::create_with_owners",
    type_arguments: [],
    arguments: [[owner2.address().hex(), owner3.address().hex()], 2, ["Shaka"], [BCS.bcsSerializeStr("Bruh")]],
    });
    await client.generateSignSubmitWaitForTransaction(owner1, createMultisig.payload);

    Funding the Multisig Account: Funds are provided to the created multisig account.

    await faucetClient.fundAccount(multisigAddress, 100_000_000);

    Creating and Executing Multisig Transactions: Transactions for transferring coins using the multisig account are created and executed.

    const recipient = new AptosAccount();
    const transferTxPayload = new MultiSigTransactionPayload(
    EntryFunction.natural(
    "0x1::aptos_account", "transfer", [],
    [BCS.bcsToBytes(AccountAddress.fromHex(recipient.address())), BCS.bcsSerializeUint64(1_000_000)]
    ),
    );
    const createMultisigTx = await client.generateTransaction(owner2.address(), /*...*/);
    await client.generateSignSubmitWaitForTransaction(owner2, createMultisigTx.payload);

    Executing Multisig Transactions (Using Payload Hash): Another multisig transaction is created and executed using the payload's hash. This process means creating and executing transactions in a safer and more efficient way using the hash of the payload.

    const transferTxPayloadHash = sha3Hash.create();
    transferTxPayloadHash.update(BCS.bcsToBytes(transferTxPayload));
    const createMultisigTxWithHash = await client.generateTransaction(owner2.address(), {
    function: "0x1::multisig_account::create_transaction_with_hash",
    type_arguments: [],
    arguments: [multisigAddress, transferTxPayloadHash.digest()],
    });
    await client.generateSignSubmitWaitForTransaction(owner2, createMultisigTxWithHash.payload);

    Managing Multisig Account Owners: The process of adding new owners to the multisig account and then removing them is carried out.

    const addOwnerPayload = new MultiSigTransactionPayload(
    EntryFunction.natural(
    "0x1::multisig_account", "add_owner", [],
    [BCS.bcsToBytes(AccountAddress.fromHex(owner_4.address()))]
    ),
    );
    const removeOwnerPayload = new MultiSigTransactionPayload(
    EntryFunction.natural(
    "0x1::multisig_account", "remove_owner", [],
    [BCS.bcsToBytes(AccountAddress.fromHex(owner_4.address()))]
    ),
    );

    Changing Signature Threshold: The signature threshold of the multisig account is changed to 3-of-3.

    const changeSigThresholdPayload = new MultiSigTransactionPayload(
    EntryFunction.natural(
    "0x1::multisig_account", "update_signatures_required", [],
    [BCS.bcsSerializeUint64(3)]
    ),
    );

    Reject and Approve Function (rejectAndApprove): Implements the process of rejecting or approving multisig transactions.

    const rejectAndApprove = async (client, owner1, owner2, multisigAddress, transactionId) => {
    let rejectTx = await client.generateTransaction(
    owner1.address(),
    {
    function: "0x1::multisig_account::reject_transaction",
    arguments: [multisigAddress, transactionId],
    /* ... */
    }
    );
    let approveTx = await client.generateTransaction(
    owner2.address(),
    {
    function: "0x1::multisig_account::approve_transaction",
    arguments: [multisigAddress, transactionId],
    /* ... */
    }
    );
    };

    Functions to Check the Number of Owners and Signature Threshold (getNumberOfOwners, getSignatureThreshold): Implements the feature to check the number of owners and the signature threshold of the multisig account.

    const getNumberOfOwners = async (client, multisigAddress) => {
    const multisigAccountResource = await client.getAccountResource(
    multisigAddress, "0x1::multisig_account::MultisigAccount"
    );
    return Number((multisigAccountResource.data as any).owners.length);
    };
    const getSignatureThreshold = async (client, multisigAddress) => {
    const multisigAccountResource = await client.getAccountResource(
    multisigAddress, "0x1::multisig_account::MultisigAccount"
    );
    return Number((multisigAccountResource.data as any).num_signatures_required);
    };

    Below are the execution results.

    multisig-account

    Aptos's multisig feature enhances the core advantages of blockchain technology, decentralized trust, and security. It allows users to secure higher levels of security in various areas, such as asset management and contract execution. This multisig mechanism plays a crucial role in the development of decentralized applications(DApps) as one of the various features offered by the Aptos blockchain.

    Conclusion

    Through this article, we have explored the account model of the Aptos blockchain, particularly focusing on Key rotation and Multisig Account features. The unique functions and user-friendly account management system of the Aptos blockchain play an important role in the advancement of blockchain technology and its wider application. This knowledge provides valuable insights into the future of blockchain technology and its application in various application developments, helping us to actively participate in the innovative journey as members of the Aptos ecosystem.


    Reference

    https://aptos.dev/

    https://github.com/aptos-labs/aptos-core

    - + \ No newline at end of file diff --git a/tutorials/aptos-move-coin/index.html b/tutorials/aptos-move-coin/index.html index 1c007db07..abf3d40c4 100644 --- a/tutorials/aptos-move-coin/index.html +++ b/tutorials/aptos-move-coin/index.html @@ -8,7 +8,7 @@ - + @@ -20,7 +20,7 @@ because you have already registered above. The receiver should call register before calling mint.

    aptos-moon-coin-mint
  • Check if the coin have been minted in Aptos Explorer Coins tab.

    aptos-moon-coin-minted
  • Try more...

    1. Call burn function and check it out in Aptos Explorer Coins tab.
    2. Create and switch to new account address and try register. Switch to the original address again and transfer or mint to the address you just newly created.

    Reference

    https://aptos.dev/tutorials/your-first-coin/

    - + \ No newline at end of file diff --git a/tutorials/aptos-move-prover/index.html b/tutorials/aptos-move-prover/index.html index d23dab572..fd77cf4ab 100644 --- a/tutorials/aptos-move-prover/index.html +++ b/tutorials/aptos-move-prover/index.html @@ -8,7 +8,7 @@ - + @@ -21,7 +21,7 @@ You can create a sample contract hello_prover by selecting the template option and clicking the Create Template button.

    template-code-aptos

    Source Code To Prove

    Note that plus1 function is intentionally implemented wrongly to see if move prover really works.

    prove.move
    module 0x42::prove {
    fun plus1(x: u64): u64 {
    // x+1
    x+2 // error intended
    }

    spec plus1 {
    ensures result == x+1;
    }

    fun abortsIf0(x: u64) {
    if (x == 0) {
    abort(0)
    };
    }

    spec abortsIf0 {
    aborts_if x == 0;
    }
    }

    Project To Prove

    Select the project you want to verify using move prover. For now, let's choose aptos/hello_prover

    new-project-aptos

    Prove

    Click the Prove button. This button trigger aptos cli command aptos move prove for your project.

    new-project-aptos

    Check Out The Result

    Move prover results in an error message because it found the error case which the result is not equal to x plus 1.

    new-project-aptos

    Correct The Source Code And Prove Again

    Comment out x+2 and uncomment x+1 and click Prove button again.

    prove.move
    module 0x42::prove {
    fun plus1(x: u64): u64 {
    x+1
    // x+2 // error intended
    }

    spec plus1 {
    ensures result == x+1;
    }

    fun abortsIf0(x: u64) {
    if (x == 0) {
    abort(0)
    };
    }

    spec abortsIf0 {
    aborts_if x == 0;
    }
    }

    You will see the verification success message like below.

    new-project-aptos


    Reference

    https://osec.io/blog/tutorials/2022-09-16-move-prover

    https://github.com/move-language/move/blob/main/language/move-prover/doc/user/prover-guide.md

    - + \ No newline at end of file diff --git a/tutorials/index.html b/tutorials/index.html index a6bf3553d..6cd44dd3d 100644 --- a/tutorials/index.html +++ b/tutorials/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/tutorials/kms/aptos/index.html b/tutorials/kms/aptos/index.html index 611d0935d..95a7bd10b 100644 --- a/tutorials/kms/aptos/index.html +++ b/tutorials/kms/aptos/index.html @@ -8,7 +8,7 @@ - + @@ -263,7 +263,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/tutorials/kms/celo/index.html b/tutorials/kms/celo/index.html index 234f60936..1fb3ae410 100644 --- a/tutorials/kms/celo/index.html +++ b/tutorials/kms/celo/index.html @@ -8,7 +8,7 @@ - + @@ -204,7 +204,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/tutorials/kms/cosmos/index.html b/tutorials/kms/cosmos/index.html index 75d2f668d..1edbf0255 100644 --- a/tutorials/kms/cosmos/index.html +++ b/tutorials/kms/cosmos/index.html @@ -8,7 +8,7 @@ - + @@ -281,7 +281,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/tutorials/kms/ethereum/index.html b/tutorials/kms/ethereum/index.html index f46702ef0..ad091d7fc 100644 --- a/tutorials/kms/ethereum/index.html +++ b/tutorials/kms/ethereum/index.html @@ -8,7 +8,7 @@ - + @@ -199,7 +199,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/tutorials/kms/index.html b/tutorials/kms/index.html index 94bcca0b3..eb64776e7 100644 --- a/tutorials/kms/index.html +++ b/tutorials/kms/index.html @@ -8,14 +8,14 @@ - +

    @dsrv/kms

    November 11, 2022
    Nahee Park
    Software Engineer, DSRV

    Sign Transaction General

    info

    We'd like to look at the conceptual information contained in transaction signatures before moving on to the tutorial on sending transactions by chain using the @dsrv/kms package.

    1. About Encryption

    Encryption is a method used to hide sensitive information from prying eyes and prevent unauthorized access, as well as to validate the validity of published papers. In blockchain, asymmetric key cryptography is a term that describes the usage of various keys for encryption and decoding. The two distinct keys are referred to as private keys and public keys, which is also known as public-key encryption. Then, how do these encryption techniques function to verify the legitimacy of documents? Let's examine the following example. kms-tutorial

    1. Using an asymmetric technique, Alice creates a pair of key pairs. - Alice can validate her identity using a public key.
    2. Alice hashes the plaintext to send and reduces it to a predetermined length.
      • There are items in the plaintext that identify the author.
      • Public keys are contained in the item.
    3. Utilize Alice's private key to sign the sentence's hash.
      • Alice can then obtain the sentence's signature.
    4. Alice delivers a signed message(plaintext and sentence's signature) to Bob.
    5. Using the signature and the public key in plaintext, Bob may decrypt the plaintext again and retrieve the hash value.
      • At this stage, Bob can be certain that Alice created the phrase if he or she has the same hash value as the hash value obtained through decryption.

    This public key strategy's primary feature is that messages signed exclusively using Alice's private key can only be unlocked using Alice's public key. Since Alice's public key may be used to decrypt messages, it is possible to tell whether or not someone else signed and sent the message because the original content will not display correctly.

    2. Encryption used for transaction transmission

    So how does blockchain use the asymmetric encryption technology that establishes authenticity stated above? When sending transactions on the blockchain, encryption is primarily used to verify the legitimacy of the transaction. If a user requests that money be transferred from Alice's account to Bob's account via a blockchain transaction, the blockchain node must be able to confirm that the user is the rightful owner of Alice's account. Let's examine the examples below to help you grasp this.

    1. A user encrypts a transaction statement by signing it with a private key and transferring money from their account to Bob's account.
      • By signing the transaction, you can collect signatures.
    2. Transmits signed transactions to nodes in the third party.
    3. The node will now verify the legitimacy of the signed transaction.
      • To decode the transaction, the node uses Alice's public key since it believes the author to be a transaction signed by Alice.
      • You can tell if a transaction is genuine by comparing the transaction text that was decrypted using Alice's public key to the original transaction.

    If you look at the sdk of the chains, each transaction has its own serialize and deserialize routines. All blockchains contain serialize standards that turn transactions into byteArray. Before signing, the ByteArray that results from serializing the transaction is just plain text. The private and public keys in your wallet serve as the signature keys and the address of the blockchain that you control.

    Tutorial

    info

    In this lesson, we'll look at using the @dsrv/kms package to transfer transactions in chains. Install @dsrv/kms first by running the following command.

    # using npm
    npm install @dsrv/kms

    # using yarn
    yarn add @dsrv/kms

    Each chain has its own individual procedure for using @dsrv/kms to transmit transactions, however most chains adhere to a standard procedure.

    1. Using SDK, generate raw transactions for each chain.
    2. Obtain a signature by using the signTx method of @dsrv/kms.
      1. Combine the raw transaction produced earlier with the signature produced by @dsrv/kms to create a signed transaction.
    3. The signed transaction is sent across the SDK by chain.

    Sending transactions by chain is explained in great detail in the Chain by section.

    tip

    For individuals having a foundational understanding of HTML, CSS, and JavaScript, this tutorial is advised.

    - + \ No newline at end of file diff --git a/tutorials/kms/near/index.html b/tutorials/kms/near/index.html index 5b4c66909..10bc77bd6 100644 --- a/tutorials/kms/near/index.html +++ b/tutorials/kms/near/index.html @@ -8,7 +8,7 @@ - + @@ -242,7 +242,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/tutorials/kms/solana/index.html b/tutorials/kms/solana/index.html index 4897a514e..e52cfbf17 100644 --- a/tutorials/kms/solana/index.html +++ b/tutorials/kms/solana/index.html @@ -8,7 +8,7 @@ - + @@ -220,7 +220,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/tutorials/near-ecosystem/account/index.html b/tutorials/near-ecosystem/account/index.html index cd643908e..42b138806 100644 --- a/tutorials/near-ecosystem/account/index.html +++ b/tutorials/near-ecosystem/account/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ account_5 account_6

    Now, you can see that the named account has been created successfully and is searched in Explorer. And you can also see that the value passed by the new_public_key has been added as the Full Access Key.

    Permissions Through Access Keys

    Using an account in a blockchain means using the account’s private key to sign a transaction. NEAR’s Accounts can have multiple access keys(public key - private key pair) and each access key has access to the Account. The access keys belong to the account and are stored in the form account_id, public_key. This has the advantage of giving limited authorization to third parties requiring permission to the account and being able to delete permissions at any time. An account can have multiple access keys, and a single access key can also be added to multiple accounts.

    Full Access Keys

    There are two types of access keys in NEAR: Full Access Key and Function Call Key.

    Full Access Key can sign any transactions that take any actions, and has the right to add or delete other access keys to the account and also delete the account itself. You will add the first Full Access Key when you create an account for the first time.

    If you want to add a Full Access Key to the account you created earlier, you can simply add it with the command below using near-cli.

    near add-key {account_id} {public_key}
    WELLDONESTUDIO’s Tip

    If you want to check the access keys stored in your account, enter the following command:

    near keys {account_id}

    Since near-cli’s default network is testnet, if you want to search on mainnet, specify the following environment variables:

    export NEAR_ENV=mainnet

    Function Call Keys

    Function Call Keys only have permission to call non-payable method on contracts, i.e. methods that do not require you to attach NEAR Ⓝ. It allows you to specify the methods the key allows to calls, if you specify nothing it allows all non-payable methods.

    The near-cli command to add Function Call Key is as follows:

    near add-key {account_id} {public_key} --contract-id {contract_id} --method-names {method_name} --allowance {allowance}

    Required arguments are account_id, public_key, contract_id. method_name allows permission to invoke all non-payable methods if omitted. allowance specifies the balance limit that can be paid when using the access key. That is, each time you call the method using the access key and pay the gas fee, the balance in the account and the allowance in the access key decrease together. You can pass None as an allowance to not limit the balance, and if the value is omitted, only view methods that do not cost the gas fee can be called.

    Most of NEAR’s dApps generate a Function Call Key and request permission from the user. Therefore, if you use the non-payable function, you can proceed without additional interaction from the user, and if you want to send a token, you must ask the user for authorization once again.

    Simple to Develop Smart Contracts

    An account is required to deploy smart contracts in NEAR. Only one smart contract can be deployed and activated per account, which is stored in the state of the account. Contracts can also have their own storage and execute transactions in the name of the account.

    Smart Contracts need to be compiled into WebAssembly and NEAR currently supports Rust, Javascript, and Assemblyscript in languages that can write smart contracts. A detailed description of the contract for NEAR will be covered in the next tutorial.

    Mutable State (Storage)

    Each account has an state associated where it stores its metadata and all the contract-related data (contract's code + storage). Accounts' states can be read by anyone  in the network, but only the account itself can change it. Also, each account pays for their own storage by locking a part of their balance proportional to the space used.

    Account’s Metadata

    The state in the Account stores metadata. Check the state of the previously created account with following command:

    near state {account_id}

    account_7

    • amount: The accounts balance expressed in yoctoNEAR (1 Ⓝ = 10^24yⓃ).
    • code_hash: A hash of the contract’s Wasm file, filled with 1s if no contract is present. In the example above, you can see that the value is filled with 1 because the contract is not deployed to the account.
    • storage_usage: Amount of bytes used for storage by the account (code + metadata + data storage)

    Contract’s State

    The state is also the place where both the contract's code and the contract's storage are stored. The contract's storage is organized as key-value pairs encoded using base64 and JSON serialization (or Borsh in Rust).

    You can check an accounts contract state by running the following command:

    near view-state {account_id} --finality final --utf8 true

    If the smart contract is not deployed in the account, an empty array will be returned, and if the contract is deployed, the value stored in the contract will be returned to the key-value pair as shown below.

    account_8

    Paying for Storage

    In order to pay for storage, accounts needs to lock a portion of their balance proportional to the amount of data being stored. If more data is added and the state increases, the account’s balance decreases, and if data is deleted and the state decreases, the account’s balance increases.

    Currently(2022.10.17 NEAR Docs), it cost approximately 1 Ⓝ to store 100kb of data.

    Wrap-Up

    We learned how the account model works in the NEAR ecosystem and created an account using near-cli. The characteristic of NEAR Account is

    1. Human-Readable Account ID
    2. Multiple Access Keys: Full Access Key & Function Call Key
    3. Smart Contract deployed in Account
    4. Has a State that stores metadata, code, and storage of contracts.

    We hope that this tutorial will help those who are curious about NEAR’s Account model, and we will be back with a tutorial on NEAR’s contract next time.


    Reference

    https://docs.near.org/concepts/basics/accounts/model

    https://nomicon.io/DataStructures/Account

    https://docs.near.org/integrator/implicit-accounts

    - + \ No newline at end of file diff --git a/tutorials/near-ecosystem/index.html b/tutorials/near-ecosystem/index.html index d61bdc458..b75299a89 100644 --- a/tutorials/near-ecosystem/index.html +++ b/tutorials/near-ecosystem/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/tutorials/near-ecosystem/migrate-contract/index.html b/tutorials/near-ecosystem/migrate-contract/index.html index 26dd6ad6f..d894184d0 100644 --- a/tutorials/near-ecosystem/migrate-contract/index.html +++ b/tutorials/near-ecosystem/migrate-contract/index.html @@ -8,14 +8,14 @@ - +

    How to Migrate the Contract

    January 3, 2023
    Suji Yoon
    Software Engineer, DSRV

    Introduction

    In NEAR, the smart contract is stored in the state of the Account. We learned from the Account Model tutorial that only one account can be deployed and activated per account. If we want to change a contract that has already been deployed, what should we do? This tutorial takes a look at various ways to update smart contracts that have already been deployed and has hands-on contract migration exercises using the WELLDONE Code.

    Updating Contracts

    During the development, and sometimes even in production, updates to a contract’s code (or even data) are needed. If you are in the local development environment, you can simply deploy an updated contract to a new account, but the downside is that you cannot use the data from the previously deployed contract as it is. Therefore, if you want to keep the data from previously deployed contracts, or if you have already deployed contracts to the mainnet and are operating the service, you should use the method of migrating contracts deployed to your existing account.

    Let’s now look at three ways to update your contract.

    Re-deploy another contract

    You can update contracts by simply redeploying them to the new account if you don't need to maintain the previously deployed contracts’ state. You can easily create a new dev-account and deploy the contract using NEAR CLI’s dev-deploy command in the testnet. If you want to use the same account ID you used before, delete the account and create an account with the same name again. When an account is deleted, data from an existing contract is also deleted, so you can get the same effect as deploying the contract to the new account.

    To deploy the contract to dev-account, you must install NEAR CLI first.

    near dev-deploy --wasmFile [route_to_wasm]

    The above command automatically creates a new testnet Account with the prefix dev- and deploys the contract to that account. The generated dev-account information is stored in the neardev folder of the current location, and the private key is stored in the ~/.near-credentials folder.

    If the neardev folder already exists, the dev-deploy command will deploy contracts to the current dev-account rather than creating a new account. As a result, if you want to create a new dev-account and deploy the contract again after modifying it, you must delete the neardev folder first.

    Next, let's see how to deploy contracts by deleting existing account and recreating account with the same name. The NEAR CLI is also used for this method. Let's say you wish to update an existing contract that is now deployed to sub-account named app-name.you.testnet.

    First, delete app-name.you.testnet where existing contract was deployed. Please be aware that in order to delete an account, you must have the account's Full Access Key.

    near delete app-name.you.testnet you.testnet

    If you run the above command, app-name.you.testnet will be deleted, and the token remaining in the account will be sent to you.testnet and the data of the contract deployed to that account is also deleted.

    Then, create a sub-account with the same name again and deploy the modified contract to that account.

    near create-account app-name.you.testnet --masterAccount you.testnet
    near deploy --accountId app-name.you.testnet --wasmFile [route_to_wasm]

    Since all of the contract data in the account will be deleted if you delete and recreate the account, doing it this way will have the effect of deploying the contract for the first time.

    Migrating the State

    If you want to redeploy the updated smart contract in the same Account while keeping the previous contract’s data, you need a method to migrate the smart contract’s state.

    Why can't we simply redeploy the updated contract to the account where the previous contract was deployed? The smart contract of NEAR is stored in the Account’s state separately in code (logic) and state (storage). So, If you redeploy the contract to the account, the contract’s code will change but the contract’s state will remain the same.

    When your contract is executed, the NEAR Runtime reads the serialized state from the disk and attempts to load it using the current contract code. If the contract code has a different state than the already deployed one, the Cannot deserialize the contract state error occurs. Therefore, if you modify the state of the contract, you need a migration method to read the status of the previous contract state.

    The migration method implements following:

    1. Reads the current state of the contract
    2. Applies different functions to transform it into the new state
    3. Returns the new state

    Let's take a closer look at the example using the migration method in the practice part using the WELLDONE Code.

    Programmatic Update

    There is a way to implement a method that allows smart contract updates by itself. It is usually used by deploying smart contract code that implements that method, and then deleting all Full Access Keys in the account where the smart contract was deployed. This clearly shows that no one outside, including the developer, can’t modify the smart contract. When all Full Access Keys in the account are deleted, the account is said to be locked. Only the smart contract itself can update the contract in this case.

    This method ensures that malicious updates do not occur without users consent, as the contract update process is transparent to all dApp users.

    A smart contract can also update itself by implementing a method that:

    1. Takes the new wasm contract as input
    2. Creates a Promise to deploy it on itself
    pub fn update_contract(&self) -> Promise {
    // Check the caller is authorized to update the code
    assert!(env::predecessor_account_id() == self.manager, "Only the manager can update the code");

    // Receive the code directly from the input to avoid the
    // GAS overhead of deserializing parameters
    let code = env::input().expect("Error: No input").to_vec();

    // Deploy the contract on self
    Promise::new(env::current_account_id())
    .deploy_contract(code)
    .function_call(
    "migrate".to_string(),
    NO_ARGS,
    0,
    CALL_GAS
    )
    .as_return()
    }

    See full example on Github. There is also an JavaScript example.

    Get your Hands Dirty on WELLDONE Code

    Now, let's practice how to write the migration method to update smart contracts written as Rust in the WELLDONE Code.

    Prerequisites
    • Please create a NEAR testnet account in WELLDONE Wallet referring to the manual in docs. You need a certain amount of NEAR testnet tokens.
    • The purpose of this part is to practice contract migration. Please refer to the Code Docs or dApp development tutorial for basic connection and usage of WELLDONE Code.

    First, let's take a quick look at the contract we're going to use. This contract is a contract called GuestBook, which stores a vector array of structures called PostedMessage and a vector array of Balance in a state. The method includes add_message to add a message, get_message to read stored messages, and get_payments to read payments. The complete code for the contract can be found in the following repository.

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize, Serialize)]
    #[serde(crate = "near_sdk::serde")]
    pub struct PostedMessage {
    pub premium: bool,
    pub sender: AccountId,
    pub text: String,
    }

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize)]
    pub struct GuestBook {
    messages: Vector<PostedMessage>,
    payments: Vector<Balance>,
    }

    Deploy the Contract

    Now, let’s go to WELLDONE Code and deploy the GuestBook contract first.

    1. Go to NEAR section and Connect to WELLDONE.

      The connected account should be the account we will deploy the contract to. Please create a new account that has never deployed contracts before and connect to it.

      contract_1
    2. In the Project section, select Rust option and write a project’s name in Project section then click the New Project button.

      contract_2

      A project structured with the same name will be created in the near folder if you open File Explorer.

      contract_3
    3. Copy and paste the code below.

      • Cargo.toml
      [package]
      name = "guestbook"
      version = "1.0.0"
      authors = ["Near Inc <hello@near.org>"]
      edition = "2021"

      [lib]
      crate-type = ["cdylib"]

      [dependencies]
      near-sdk = "4.0.0"
      uint = { version = "0.9.3", default-features = false }
      • src/lib.rs
      use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
      use near_sdk::collections::Vector;
      use near_sdk::json_types::U128;
      use near_sdk::serde::Serialize;
      use near_sdk::{env, near_bindgen, AccountId, Balance};

      const POINT_ONE: Balance = 100_000_000_000_000_000_000_000;

      #[near_bindgen]
      #[derive(BorshDeserialize, BorshSerialize, Serialize)]
      #[serde(crate = "near_sdk::serde")]
      pub struct PostedMessage {
      pub premium: bool,
      pub sender: AccountId,
      pub text: String,
      }

      #[near_bindgen]
      #[derive(BorshDeserialize, BorshSerialize)]
      pub struct GuestBook {
      messages: Vector<PostedMessage>,
      payments: Vector<Balance>,
      }

      impl Default for GuestBook {
      fn default() -> Self {
      Self {
      messages: Vector::new(b"m"),
      payments: Vector::new(b"p"),
      }
      }
      }

      #[near_bindgen]
      impl GuestBook {
      #[payable]
      pub fn add_message(&mut self, text: String) {
      let payment = env::attached_deposit();
      let premium = payment >= POINT_ONE;
      let sender = env::predecessor_account_id();

      let message = PostedMessage {
      premium,
      sender,
      text,
      };
      self.messages.push(&message);
      self.payments.push(&payment);
      }

      pub fn get_messages(&self, from_index: Option<U128>, limit: Option<u64>) -> Vec<PostedMessage> {
      let from = u128::from(from_index.unwrap_or(U128(0)));

      self.messages
      .iter()
      .skip(from as usize)
      .take(limit.unwrap_or(10) as usize)
      .collect()
      }

      pub fn get_payments(&self, from_index: Option<U128>, limit: Option<u64>) -> Vec<U128> {
      let from = u128::from(from_index.unwrap_or(U128(0)));

      self.payments
      .iter()
      .skip(from as usize)
      .take(limit.unwrap_or(10) as usize)
      .map(|x| U128(x))
      .collect()
      }
      }
    4. Compile the contract.

      Select Rust compile option and click the Compile button. The wasm file is returned after the compilation is complete.

      contract_4
    5. Deploy the Contract.

      When the compilation is complete, the Deploy section automatically appears below. Enter the ID of the account for which you want to deploy contracts, and then click the Deploy button. This requires interaction with the WELLDONE Wallet.

      contract_5
    6. Execute the contract.

      You can see the deployed contract after the deployment is complete. Run the add_messages method to check the contract is deployed well. The value passed in the text field becomes a message, and the amount of tokens passed in the deposit becomes payments. Because add_messages is the call method, click the Call button to run the method.

      contract_6

      If the transaction is successful, run the get_messages or get_payments view methods to confirm that the previously added massages and payments values are returned.

      contract_7 contract_8

    Writing a Migration Method

    Let's assume that we want to change the state of the contract we deployed as follows. Previously, payments were saved in GuestBook, but after the change, payments will be managed together in PostedMessage. We know that when the status of the smart contract is changed like this, the Cannot deserialize the contract state error will occur if the contract is redeployed into the same account.

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize, Serialize)]
    #[serde(crate = "near_sdk::serde")]
    pub struct PostedMessage {
    pub payment: u128,
    pub premium: bool,
    pub sender: AccountId,
    pub text: String,
    }

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize)]
    pub struct GuestBook {
    messages: Vector<PostedMessage>,
    }

    To solve this problem, we need to add the migration method to the updated contract.

    Again, the migration method implements following:

    1. Reads the current state of the contract
    2. Applies different functions to transform it into the new state
    3. Returns the new state

    In other words, you need to write a method to iterate through the old GuestBook state and convert them to a new PostedMesage struct(payment, premium, sender, text).

    Please create a new file called src/migrate.rs and paste the codes below.

    use crate::*;

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize, Serialize)]
    #[serde(crate = "near_sdk::serde")]
    pub struct OldPostedMessage {
    pub premium: bool,
    pub sender: AccountId,
    pub text: String,
    }

    #[derive(BorshDeserialize, BorshSerialize)]
    pub struct OldState {
    messages: Vector<OldPostedMessage>,
    payments: Vector<Balance>,
    }

    #[near_bindgen]
    impl GuestBook {
    #[private]
    #[init(ignore_state)]
    pub fn migrate() -> Self {
    // retrieve the current state from the contract
    let old_state: OldState = env::state_read().expect("failed");

    // iterate through the state migrating it to the new version
    let mut new_messages: Vector<PostedMessage> = Vector::new(b"p");

    for (idx, posted) in old_state.messages.iter().enumerate() {
    let payment = old_state.payments.get(idx as u64).unwrap_or(0);

    new_messages.push(&PostedMessage {
    payment,
    premium: posted.premium,
    sender: posted.sender,
    text: posted.text,
    })
    }

    // return the new state
    Self {
    messages: new_messages,
    }
    }
    }

    Also modify the src/lib.rs to the updated version of contact as below.

    use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
    use near_sdk::collections::Vector;
    use near_sdk::json_types::U128;
    use near_sdk::serde::Serialize;
    use near_sdk::{env, near_bindgen, AccountId, Balance};

    mod migrate;

    const POINT_ONE: Balance = 100_000_000_000_000_000_000_000;

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize, Serialize)]
    #[serde(crate = "near_sdk::serde")]
    pub struct PostedMessage {
    pub payment: u128,
    pub premium: bool,
    pub sender: AccountId,
    pub text: String,
    }

    #[near_bindgen]
    #[derive(BorshDeserialize, BorshSerialize)]
    pub struct GuestBook {
    messages: Vector<PostedMessage>,
    }

    impl Default for GuestBook {
    fn default() -> Self {
    Self {
    messages: Vector::new(b"m"),
    }
    }
    }

    #[near_bindgen]
    impl GuestBook {
    #[payable]
    pub fn add_message(&mut self, text: String) {
    let payment = env::attached_deposit();
    let sender = env::predecessor_account_id();
    let premium = payment >= POINT_ONE;
    let message = PostedMessage {
    payment,
    sender,
    premium,
    text,
    };
    self.messages.push(&message);
    }

    pub fn get_messages(&self, from_index: Option<U128>, limit: Option<u64>) -> Vec<PostedMessage> {
    let from = u128::from(from_index.unwrap_or(U128(0)));

    self.messages
    .iter()
    .skip(from as usize)
    .take(limit.unwrap_or(10) as usize)
    .collect()
    }
    }

    Here we should note that the migration method is the initialization method. This is the method that must be executed first before other methods in the contract are executed, and only once. If you run another method before executing the 'migration' method, the Cannot deserialize the contract state error will occur the same way.

    Re-deploy the Contract

    Now, let’s redeploy the updated contract to the same account.

    1. Compile the modified contract again.

      Delete the out folder of the project and click the Compile button. If you do not delete the out folder, the error log If you want to run a new compilation, delete the 'out' directory and click the Compile button again. will be printed on the terminal.

    1. Specify the migration method as an Init function and proceed with redeployment.

      A modal window will appear asking the user for their agreement once more because the account already has a contract deployed. Press the YES button to proceed with the deployment.

      contract_9contract_10
    2. Execute the contract.

      When the contract deployment is complete, it automatically show the updated contract. By running the get_messages method, you can see that the previously stored information is well converted into a newly updated structure and outputs it.

      contract_11

    Wrap-Up

    In this tutorial, we learned how to update the contract that has already deployed to account and had hands-on contract migration exercises using the WELLDONE Code.

    Here’s how to update a contract that already have been deployed to account:

    1. Deploy to a new account
    2. Using a migration method
    3. Using a programmatic update

    We hope this tutorial will help those who are curious about how to maintain the smart contract in NEAR. Thank you for reading!


    Reference

    https://docs.near.org/develop/upgrade

    https://docs.near.org/concepts/web3/near#contract-upgrades

    https://docs.near.org/develop/contracts/serialization#deserialization-error

    - + \ No newline at end of file diff --git a/tutorials/near/index.html b/tutorials/near/index.html index 45231b71f..a315e2b4e 100644 --- a/tutorials/near/index.html +++ b/tutorials/near/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/tutorials/near/rust/index.html b/tutorials/near/rust/index.html index 018979194..46df4fbee 100644 --- a/tutorials/near/rust/index.html +++ b/tutorials/near/rust/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/tutorials/near/rust/near-contract/index.html b/tutorials/near/rust/near-contract/index.html index 97d2a2ea8..649a39984 100644 --- a/tutorials/near/rust/near-contract/index.html +++ b/tutorials/near/rust/near-contract/index.html @@ -8,7 +8,7 @@ - + @@ -21,7 +21,7 @@ 1_19

    note

    Close the open WELLDONE Wallet extension window and try again if a log with the following values is output in the terminal: {"type":"error","value":"User rejected transaction signature.”}

    The following log is output to the terminal and the details of the deployed contract are shown on the left panel if transaction verification is complete and the receipt is successfully arrived.

    1_20 1_21

    Interact with Smart Contract using WELLDONE Code

    Let’s now interact with the contract deployed using WELLDONE Code. The Methods section shows the list of methods the contract has. If arguments are required, click the Add Argument button to add the required argument name, type, and value. Deposit can specify the amount of tokens to be sent with the transaction in NEAR or yoctoNEAR units. After that, depending on the method type, you can either click call or view to execute the contract.

    1_22

    In NEAR, there are two methods for calling a contract: view and call. The view is used to execute a function that just checks the status of the contract, so you don’t have to pay for gas. The get_num method in the counter contract is view function.

    The call is used to call a function that modifies the state of the contract. Since it is a transaction to pay for gas, WELLDONE Wallet signature is necessary. The increment, decrement, and reset methods in the counter contract use call.

    Execute get_num method

    Let’s first execute the get_num method. Select get_num in the Methods section and click View button. Since the view function does not need to be signed through the wallet, it does not require any interaction with the wallet. If the method is successfully executed, the terminal will display the result.

    1_23

    Execute increment, decrement, reset method

    Next, let’s execute the call functions. Select increment in the Methods section and click the Call button without adding any arguments as the method doesn’t need any arguments. Then the WELLDONE Wallet is activated. Click the SendTx and then wallet will return the transaction hash value.

    If the transaction is successful, the following transaction receipt will show up on the terminal:

    1_24

    If you execute the get_num method again to get the counter value, you can see that the counter has successfully increased to 1. The decrement and reset methods can be executed in the same way.

    Wrap-Up

    We learned how to write, deploy, and execute a smart contract in NEAR using WELLDONE Code. With WELLDONE Code, you can develop smart contracts without requiring any other environment settings other than WELLDONE Wallet. If you want to learn how to communicate frontend and smart contracts using Universal Provider, check out the next tutorial.

    - + \ No newline at end of file diff --git a/tutorials/near/rust/near-frontend/index.html b/tutorials/near/rust/near-frontend/index.html index 6671891ff..906153bbf 100644 --- a/tutorials/near/rust/near-frontend/index.html +++ b/tutorials/near/rust/near-frontend/index.html @@ -8,7 +8,7 @@ - + @@ -159,7 +159,7 @@ } }
    Result
    Loading...

    Using Wallet Selector

    Wallet Selector is an officially supported project by NEAR that provides abstractions of key features of the wallet for easy communication with dApp users with various wallets that support the NEAR protocol. Users can select the wallet they want and communicate with it using the abstraction method provided by Wallet Selector.
    Press the Log in button to connect to the WELLDONE Wallet, then click the Send a Transaction button to run theincrement method. Press the Get Count button to view the current count value of the contract.

    WELLDONE Wallet is an officially supported wallet by Wallet Selector. If you are curious about the complete example code for sending transactions using Wallet Selector, please check GitHub.

    - + \ No newline at end of file diff --git a/tutorials/sui-game/game/index.html b/tutorials/sui-game/game/index.html index 4b99b614c..04ae43156 100644 --- a/tutorials/sui-game/game/index.html +++ b/tutorials/sui-game/game/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ study_u_and_i_1_2

    2. Change to the testnet

    Since the game contract is deployed on the testnet, change the network to the testnet in your wallet. study_u_and_i_7_1 study_u_and_i_7_2

    3. Connect to WELLDONE Wallet

    When the wallet pops up, click the Accept button to connect the wallet.

    study_u_and_i_2_1

    4. Faucet your account

    You need to get funds to pay for gas. From your wallet, go to the Faucet tab, click the Request Faucet button, and wait for a second.

    info

    Our wallet uses cURL to request test tokens, and the testnet rpc is sometimes unstable. In that case, please refer to this page. You can request test tokens through Sui Discord.

    study_u_and_i_8_1

    5. SHOP

    If the wallet connection is successful, your Sui address will appear in the top left corner of the screen. Then, go to the SHOP.

    study_u_and_i_3_1

    Buy one Axe and one Enchant Scroll. Select each item in turn and click the blue button. When the wallet pops up, click the Send button to buy an item.

    info

    Your test account must have funds to pay for gas.

    study_u_and_i_3_2

    After sending each transaction, you can look up the received Tx Hash in SUI Explorer to check the items that you bought.

    study_u_and_i_3_3

    6. INVENTORY

    In the INVENTORY, you can view the items you have.

    study_u_and_i_4_1

    If you followed the previous steps, you may have one Axe and one Scroll. The number in the Axe item box indicates the current level of the item. If you just bought the item, it will probably be 0.

    And the number in the Scroll item box is the number of levels an item can be upgraded by spending that scroll.

    7. UPGRADE

    You will now spend a Scroll to enchant your Axe. Go to the UPGRADE and select the Axe and Scroll.

    study_u_and_i_5_1

    After enchanting, the level of the Axe will be 1 higher than its current level plus the level of the Scroll. This is because items are enchanted using the code below:

        item_axe.level = item_axe.level + item_scroll.level + bonus;

    The bonus is determined by the output value of the Verifiable Random Function (VRF). Study U&I uses Sui's VRF to enchant items.

    Why is the Verifiable Random Function important?
    A Verifiable Random Function (VRF) enables the holder of a private key to generate a hashed value for the message, which can be verified by anyone possessing the corresponding public key to ensure the validity of the hash. Therefore, by using VRF users have the ability to verify the random value used in games. Moreover, it also allows users can provide an input seed for the game company to use when generating a random value, and users can always verify that the game company used that seed to generate the random. It is transparent.

    However this demo version doesn't have a backend server, so it uses a pre-generated fixed VRF value. Therefore, the value of the bonus is always 1.

    For the full Study U&I Smart Contract code, how to deploy it, and more information about VRF, check out the Building a Game on Sui with VRF and Dynamic NFTs.

    Click the enchant button. When the wallet pops up, click the Send button to enchant an item.

    study_u_and_i_5_2

    8. Last Step

    After enchanting, you can check in your inventory or Sui Explorer that the Axe leveled up and the Scroll was burned. The image of the Axe will also change based on the specific item level.

    study_u_and_i_6_1study_u_and_i_6_2

    The current version focuses more on how to use VRF in the game, rather than the gameplay. For gameplay, stay tuned for our next series.

    - + \ No newline at end of file diff --git a/tutorials/sui-game/index.html b/tutorials/sui-game/index.html index 3ec970654..8fd1a1cf7 100644 --- a/tutorials/sui-game/index.html +++ b/tutorials/sui-game/index.html @@ -8,13 +8,13 @@ - +

    Building a Game on Sui with VRF and Dynamic NFTs

    July 17, 2023
    Hyunsun Yoo
    Software Engineer, DSRV

    Introduction

    template-code-sui

    Here is an educational game prototype that can be fast, scalable, and transparent with mutable, fully on-chain NFTs and verifiable random function. Sui has a lot of unique features. Sui’s unique language, Move is awesome: It’s safe, efficient for blockchain, and resistant to vulnerabilities such as reentrancy. But without move expertise, here's an easy way to build a game on Sui, with a web IDE that doesn't require any development setup. And let's take a look at how Sui's unique features, such as dynamic NFTs and VRF, can enhance the gaming experience.

    🎮 Study U&I, is playable now.

    Code Tutorials

    Smart Contract: Item Struct

        /// Item NFT
    struct Item has key, store {
    id: UID,
    name: string::String,
    description: string::String,
    url: Url,

    /// TODO: add custom attributes
    itemType: u8,
    level: u8,
    }

    Smart Contract: Ownership

        struct Ownership has key {
    id: UID
    }

    fun init(ctx: &mut TxContext) {
    let ownership = Ownership {
    id: object::new(ctx),
    };

    /// Transfer the ownership object to the module/package publisher
    transfer::transfer(ownership, tx_context::sender(ctx));
    }

    Use the Ownership object to ensure that only authorized people can mint and modify NFTs. In this example, the authorized person is the module/package publisher (the game company). Transfer the Ownership object to the publisher in the init function, which is executed only once when deploying the smart contract.

    Smart Contract: Create Item

        /// Create a new Item by contract owner
    public entry fun mint(
    _: &Ownership,
    name: vector<u8>,
    description: vector<u8>,
    url: vector<u8>,
    itemType: u8,
    recipient: address,
    ctx: &mut TxContext
    ) {
    let sender = tx_context::sender(ctx);
    let item = Item {
    id: object::new(ctx),
    name: string::utf8(name),
    description: string::utf8(description),
    url: url::new_unsafe_from_bytes(url),
    itemType: itemType,
    level: 0
    };

    event::emit(ItemMinted {
    object_id: object::id(&item),
    creator: sender,
    name: item.name,
    });

    transfer::public_transfer(item, recipient);
    }

    By taking Ownership as the parameter, only addresses that own the Ownership object can call the mint function.

    Smart Contract: Request Updating Item

        /// An object for consign
    struct ConsignedObj has key, store {
    id: UID,
    /// owner of the consigned object
    sender: address,
    /// the consigned object
    item_axe: Option<ID>,
    item_scroll: Option<ID>,
    }

    ConsignedObj is an object for consigning an item to the game company to request an update on the item.

        /// `users` create a consign for consigning
    /// an Item to `third_party`
    public entry fun create(
    third_party: address,
    item_axe: Item,
    item_scroll: Item,
    ctx: &mut TxContext
    ) {
    assert!(item_axe.itemType == 0 && item_scroll.itemType != 0, EItemType);
    assert!(item_axe.level < 255 && item_scroll.level > 0, EItemLevel);

    let sender = tx_context::sender(ctx);
    let consigned = ConsignedObj { id: object::new(ctx), item_axe: option::none(), item_scroll: option::none(), sender: sender };

    option::fill(&mut consigned.item_axe, object::id(&item_axe));
    dynamic_object_field::add(&mut consigned.id, 0, item_axe);

    option::fill(&mut consigned.item_scroll, object::id(&item_scroll));
    dynamic_object_field::add(&mut consigned.id, 1, item_scroll);

    // consign the object with the trusted third party
    transfer::public_transfer(consigned, third_party);
    }
    }

    Users can call the create function to request enchanting their item. In the second parameter, pass the Axe item want to enchant, and in the third parameter, pass the Scroll item want to spend to enchant.

    Smart Contract: Update Item

        /// Trusted third party can update nft
    /// Update the `level` of 'Item'
    public entry fun upgrade_level(_: &Ownership, obj: ConsignedObj, output: vector<u8>, input: vector<u8>, public_key: vector<u8>, proof: vector<u8>, ctx: &mut TxContext) {
    let verified = ecvrf::ecvrf_verify(&output, &input, &public_key, &proof);
    event::emit(VerifiedEvent {is_verified: verified});

    assert!(!verified, ENotVerified);

    let third_party = tx_context::sender(ctx);
    let ConsignedObj {
    id: id,
    sender: sender,
    item_axe: temp_a,
    item_scroll: temp_b,
    } = obj;

    let item_axe: Item = dynamic_object_field::remove(&mut id, 0);
    let item_axe_id = option::extract(&mut temp_a);
    assert!(object::id(&item_axe) == item_axe_id, 0);

    let item_scroll: Item = dynamic_object_field::remove(&mut id, 1);
    let item_scroll_id = option::extract(&mut temp_b);
    assert!(object::id(&item_scroll) == item_scroll_id, 0);

    assert!(item_axe.itemType == 0 && item_scroll.itemType != 0, EItemType);
    assert!(item_axe.level < 255 && item_scroll.level > 0, EItemLevel);

    let popedOutput = vector::pop_back(&mut output);
    let bonus: u8 = if (popedOutput > 128) { 1 } else { 0 };

    item_axe.level = item_axe.level + item_scroll.level + bonus;

    event::emit(ItemUpgrade {
    object_id: item_axe_id,
    creator: third_party,
    name: item_axe.name,
    level: item_axe.level,
    });

    object::delete(id);
    transfer::public_transfer(item_axe, sender);
    burn(item_scroll, ctx);
    }

    The module/package publisher (the game company) can enchant an item. There are three main parts to enchanting:

    1. Verifiable Random Function (VRF)
    • The enchant function takes parameters a random output, alpha_string, public_key, and proof generated by the game company via VRF. Then inside the function, the random output is verified, and if it passes, the result of random output determines whether or not to grant bonus levels when enchanting items.
    Why is the Verifiable Random Function important in games?
    A Verifiable Random Function (VRF) enables the holder of a private key to generate a hashed value for the message, which can be verified by anyone possessing the corresponding public key to ensure the validity of the hash. Therefore, by using VRF users have the ability to verify the random value used in games. Moreover, it also allows users can provide an input seed for the game company to use when generating a random value, and users can always verify that the game company used that seed to generate the random. Since the Random Function is such an important component of gaming and blockchain, it's important to provide transparent random for Sui users.
    • For example, the game company will generate the random output using information about the user as an input seed. Then the user can always verify that the game company generated the random value with information about them.
    1. Dynamic NFTs
    • Once the random output determines how much the item will level up, change the properties of the NFT. All game items such as weapons and armor are all Dynamic NFTs on-chain. As users enchant their item with scroll, attributes such as level, power, and delay are all updated live and can be checked through Sui Explorer.
    Why is the Dynamic NFTs important in games?
    Traditional NFTs are immutable once minted, while Dynamic NFTs are programmed to change their value based on external inputs. Using Dynamic NFTs in the game enables a program to change the properties of a user's items to become more powerful based on the user's contributions as they progress through the game. Sui's fast speed allows for real-time changes of NFT in fast-paced games. Additionally, Sui's comprehensive support for fully on-chain NFTs enables dynamic NFTs, which offer great advantages in gaming applications.
    1. Returning NFT to the user who requested the enchanting
    • Using the ConsignedObj, return NFT to the user who requested the enchanting.

    Deploy Smart Contract with WELLDONE Code

    info

    Please refer to here to get started.

    New Project

    Automatically generate a contract structure. Click the Create button to create a contract structure.

    template-code-sui
    info

    You can create your own contract projects without using the features above. However, for the remix plugin to build and deploy the contract, it must be built within the directory sui/. If you start a new project, the structure should look like the following.

    sui
    └── item
    ├── Move.toml
    ├── Move.lock
    └── sources
    └── item.move

    Source Code

    item.move
    module examples::item {
    use sui::url::{Self, Url};
    use std::string;
    use sui::object::{Self, ID, UID};
    use sui::event;
    use sui::transfer;
    use sui::tx_context::{Self, TxContext};
    use std::option::{Self, Option};
    use sui::dynamic_object_field;
    use sui::ecvrf;
    use std::vector;

    /// Item NFT
    struct Item has key, store {
    id: UID,
    name: string::String,
    description: string::String,
    url: Url,

    /// TODO: add custom attributes
    itemType: u8,
    level: u8,
    }

    struct Ownership has key {
    id: UID
    }

    /// An object for consign
    struct ConsignedObj has key, store {
    id: UID,
    /// owner of the consigned object
    sender: address,
    /// the consigned object
    item_axe: Option<ID>,
    item_scroll: Option<ID>,
    }

    fun init(ctx: &mut TxContext) {
    let ownership = Ownership {
    id: object::new(ctx),
    };

    /// Transfer the ownership object to the module/package publisher
    transfer::transfer(ownership, tx_context::sender(ctx));
    }

    // ===== Error codes =====

    const ENotVerified: u64 = 0;
    const EItemType: u64 = 1;
    const EItemLevel: u64 = 2;

    // ===== Events =====

    struct ItemMinted has copy, drop {
    // The Object ID of the Item
    object_id: ID,
    // The creator of the Item
    creator: address,
    // The name of the Item
    name: string::String,
    }

    struct ItemUpgrade has copy, drop {
    // The Object ID of the Item
    object_id: ID,
    // The creator of the Item
    creator: address,
    // The name of the Item
    name: string::String,

    level: u8,
    }

    /// Event on whether the output is verified
    struct VerifiedEvent has copy, drop {
    is_verified: bool,
    }

    // ===== Public view functions =====

    /// Get the Item's `name`
    public fun name(item: &Item): &string::String {
    &item.name
    }

    /// Get the Item's `description`
    public fun description(item: &Item): &string::String {
    &item.description
    }

    /// Get the Item's `url`
    public fun url(item: &Item): &Url {
    &item.url
    }

    /// Get the Item's `itemType`
    public fun item_typel(item: &Item): &u8 {
    &item.itemType
    }

    /// Get the Item's `level`
    public fun level(item: &Item): &u8 {
    &item.level
    }

    // ===== Entrypoints =====

    /// Create a new Item
    fun mint_internal(
    name: vector<u8>,
    description: vector<u8>,
    url: vector<u8>,
    itemType: u8,
    level: u8,
    ctx: &mut TxContext,
    ) {
    let item = Item {
    id: object::new(ctx),
    name: string::utf8(name),
    description: string::utf8(description),
    url: url::new_unsafe_from_bytes(url),
    itemType: itemType,
    level: level,
    };

    event::emit(ItemMinted {
    object_id: object::id(&item),
    creator: tx_context::sender(ctx),
    name: item.name,
    });

    transfer::public_transfer(item, tx_context::sender(ctx));
    }

    public entry fun buy(
    itemType: u8,
    ctx: &mut TxContext
    ) {
    if (itemType == 0) {
    let name = b"axe";
    let desc = b"axe";
    let url = b"https://";
    mint_internal(name, desc, url, itemType, 0, ctx);
    };
    if (itemType == 1) {
    let name = b"scroll 1";
    let desc = b"scroll 1";
    let url = b"https://";
    mint_internal(name, desc, url, itemType, 3, ctx);
    };
    if (itemType == 2) {
    let name = b"scroll 2";
    let desc = b"scroll 2";
    let url = b"https://";
    mint_internal(name, desc, url, itemType, 6, ctx);
    };
    if (itemType == 3) {
    let name = b"scroll 3";
    let desc = b"scroll 3";
    let url = b"https://";
    mint_internal(name, desc, url, itemType, 9, ctx);
    };
    }

    /// Create a new Item by contract owner
    public entry fun mint(
    _: &Ownership,
    name: vector<u8>,
    description: vector<u8>,
    url: vector<u8>,
    itemType: u8,
    recipient: address,
    ctx: &mut TxContext
    ) {
    let sender = tx_context::sender(ctx);
    let item = Item {
    id: object::new(ctx),
    name: string::utf8(name),
    description: string::utf8(description),
    url: url::new_unsafe_from_bytes(url),
    itemType: itemType,
    level: 0
    };

    event::emit(ItemMinted {
    object_id: object::id(&item),
    creator: sender,
    name: item.name,
    });

    transfer::public_transfer(item, recipient);
    }

    /// Transfer `Item` to `recipient`
    public entry fun transfer(
    item: Item, recipient: address, _: &mut TxContext
    ) {
    transfer::public_transfer(item, recipient)
    }

    /// `users` create a consign for consigning
    /// an Item to `third_party`
    public entry fun create(
    third_party: address,
    item_axe: Item,
    item_scroll: Item,
    ctx: &mut TxContext
    ) {
    assert!(item_axe.itemType == 0 && item_scroll.itemType != 0, EItemType);
    assert!(item_axe.level < 255 && item_scroll.level > 0, EItemLevel);

    let sender = tx_context::sender(ctx);
    let consigned = ConsignedObj { id: object::new(ctx), item_axe: option::none(), item_scroll: option::none(), sender: sender };

    option::fill(&mut consigned.item_axe, object::id(&item_axe));
    dynamic_object_field::add(&mut consigned.id, 0, item_axe);

    option::fill(&mut consigned.item_scroll, object::id(&item_scroll));
    dynamic_object_field::add(&mut consigned.id, 1, item_scroll);

    // consign the object with the trusted third party
    transfer::public_transfer(consigned, third_party);
    }

    /// Trusted third party can update nft
    /// Update the `level` of 'Item'
    public entry fun upgrade_level(_: &Ownership, obj: ConsignedObj, output: vector<u8>, input: vector<u8>, public_key: vector<u8>, proof: vector<u8>, ctx: &mut TxContext) {
    let verified = ecvrf::ecvrf_verify(&output, &input, &public_key, &proof);
    event::emit(VerifiedEvent {is_verified: verified});

    assert!(!verified, ENotVerified);

    let third_party = tx_context::sender(ctx);
    let ConsignedObj {
    id: id,
    sender: sender,
    item_axe: temp_a,
    item_scroll: temp_b,
    } = obj;

    let item_axe: Item = dynamic_object_field::remove(&mut id, 0);
    let item_axe_id = option::extract(&mut temp_a);
    assert!(object::id(&item_axe) == item_axe_id, 0);

    let item_scroll: Item = dynamic_object_field::remove(&mut id, 1);
    let item_scroll_id = option::extract(&mut temp_b);
    assert!(object::id(&item_scroll) == item_scroll_id, 0);

    assert!(item_axe.itemType == 0 && item_scroll.itemType != 0, EItemType);
    assert!(item_axe.level < 255 && item_scroll.level > 0, EItemLevel);

    let popedOutput = vector::pop_back(&mut output);
    let bonus: u8 = if (popedOutput > 128) { 1 } else { 0 };

    item_axe.level = item_axe.level + item_scroll.level + bonus;

    event::emit(ItemUpgrade {
    object_id: item_axe_id,
    creator: third_party,
    name: item_axe.name,
    level: item_axe.level,
    });

    object::delete(id);
    transfer::public_transfer(item_axe, sender);
    burn(item_scroll, ctx);
    }

    /// Permanently delete `Item`
    public entry fun burn(item: Item, _: &mut TxContext) {
    let Item { id, name: _, description: _, url: _, itemType: _, level : _, } = item;
    object::delete(id)
    }
    }
    Move.toml
    [package]
    name = "Examples"
    version = "0.0.1"

    [dependencies]
    Sui = { git = "https://github.com/MystenLabs/sui.git", subdir="crates/sui-framework/packages/sui-framework/", rev = "testnet" }

    [addresses]
    examples = "0x0"

    Requirement

    In this scenario, you need two accounts. An account that acts as the game company that will deploy the Smart Contract, and an account that acts as the game user.

    Compile The Source Code

    Connect to the WELLDONE Code with a game company account, and select the project you want to compile. For now, let's choose sui/item and click Compile button.

    02_project-to-compile-item

    Deployment

    If the compilation succeed, you can see mv file item.mv.

    Click the Deploy button.

    03_build-file-item

    and you can see wallet popup. Let's click Send button.

    04_sui-wallet-popup

    Check Out Deployed Contract

    After deployment, you can see Item module and functions.

    Calling Contract Functions

    1. Change to a game user account, and Select buy function. Input 0 to buy an axe, and click buy button. And input 1 to buy a scroll, and click buy button.

    2. After sending each transaction, look up the received Tx Hash in SUI Explorer to check the object ID of the item that you bought for the next step.

    3. Run the create function. The first parameter is the game company address that deployed this Smart Contract. The second parameter is an object Id of the item that you bought, The value you checked in step 2. The third parameter is the same, but one of these parameters must be axe, and scroll, respectively.

    4. After sending the create transaction, look up the received Tx Hash in SUI Explorer to check the object ID of the ConsignedObj for the next step.

    5. Return to the game company account and run the upgrade_level function. The first parameter is the object ID of Ownership. And the second parameter is the object ID of ConsignedObj that you checked in Step 4. The third through sixth parameters are associated with the VRF.

    6. After enchant transaction, check if Item was returned to the game user and updated in SUI Explorer.


    Reference

    https://examples.sui.io/samples/nft.html

    https://docs.sui.io/learn/cryptography/ecvrf

    - + \ No newline at end of file diff --git a/tutorials/sui-move-coin/index.html b/tutorials/sui-move-coin/index.html index f05d2d8e1..ee971ec94 100644 --- a/tutorials/sui-move-coin/index.html +++ b/tutorials/sui-move-coin/index.html @@ -8,7 +8,7 @@ - + @@ -20,7 +20,7 @@ Second parameter is the amount of the minting coin. Third parameter is the receiver of the minting coin. For now, set the receiver to your account address.

    06_sui-my-coin-mint
  • After mint transaction, check if MYCOIN was minted in SUI Explorer.

    07_sui-my-coin-minted
  • Try more...

    1. Call burn function and check it out in SUI Explorer.
    2. Read about One Time Witness (OTW).

    Reference

    https://examples.sui.io/basics/one-time-witness.html https://github.com/MystenLabs/sui/tree/main/sui_programmability/examples/fungible_tokens

    - + \ No newline at end of file diff --git a/tutorials/sui-zklogin/index.html b/tutorials/sui-zklogin/index.html index a022f6e7c..f3af416eb 100644 --- a/tutorials/sui-zklogin/index.html +++ b/tutorials/sui-zklogin/index.html @@ -8,13 +8,13 @@ - +

    Sui zkLogin

    January 16, 2024
    Sooyoung Hyun
    Lead Software Engineer, DSRV

    Introduction

    The evolution of blockchain technology is presenting new requirements for user interfaces and security. Against this backdrop, WELLDONE zkWallet integrates the zkLogin feature of the Sui blockchain, providing an efficient way for users to access blockchain services using their existing Web2 credentials. This article will explore how WELLDONE zkWallet leverages zkLogin to enhance user experience and facilitate connections with various browser extension wallets.

    WELLDONE zkWallet and Sui's zkLogin: A Structural Approach to Enhancing User Experience and Security

    The way WELLDONE zkWallet integrates Sui's zkLogin feature offers a structural approach that simultaneously enhances the accessibility and security of blockchain technology. This integration is achieved in the following ways:

    1. Separate Webpage Integration: WELLDONE zkWallet provides a separate webpage that allows users to choose and connect various browser extension wallets. This webpage is directly integrated with Sui's zkLogin feature, enabling users to access blockchain services using their existing Web2 credentials.
    2. Zero-Knowledge Proof Mechanism: The core of zkLogin is the zero-knowledge proof technology. This technology allows users to access blockchain services securely while keeping their identity information hidden. Users can access services without revealing their identity, and this process fully protects their personal information.
    3. Dual Authentication Mechanism: WELLDONE zkWallet combines wallet key management with OAuth authentication to provide a dual security layer. Users must satisfy both elements to access their wallet: the private key of the wallet and the dual authentication approach through an OAuth provider. This offers much stronger security than single-factor authentication methods. Particularly, WELLDONE zkWallet provides an additional security mechanism by separating and storing the Web2 credential tokens and ephemeral key pairs through its web interface.
    4. Compatibility with Various Wallets: WELLDONE zkWallet is standardized and designed to be compatible with various browser extension wallets. Wallet developers do not need additional development to use zkLogin, and users can choose from a variety of wallet options according to their preference, meeting a wider range of user needs.
    5. Simplified User Interface: The web interface of WELLDONE zkWallet is user-friendly and intuitive. Users can access their wallet through their web account with just a few clicks, providing convenience while maintaining security.
    6. Seamless Integration with Dapps: WELLDONE zkWallet supports direct interaction with various decentralized applications (Dapps). This allows users to use Dapps more efficiently through their web wallets. Information about interacting with Dapps can be found in this document.

    This structural approach reduces the complexity of blockchain technology, making it easier for users to understand and utilize. The integration of WELLDONE zkWallet focuses on enabling users to use blockchain technology easily and safely, without worrying about technical barriers. We will now take a closer look through the following tutorial.

    Tutorial

    Click here to watch the video on how to run this tutorial.

    Compatible Wallets
    • WELLDONE Wallet, Sui Wallet, Elli Wallet
    1. Install WELLDONE Wallet or another browser extension wallet. You will receive a JSON Web Token (JWT) through the Public Key of the extension wallet and OAuth login, and sign transactions with the Private Key of the extension wallet. For practice, create a Sui account and set the network to Devnet.
    install-wallet
    1. Connect your wallet to the site at https://zkwallet.welldonestudio.io. Note that using an address already created through zkLogin with Sui Wallet will not work, as the Public Key is unknown.
    connect-wallet
    1. Obtain a JWT from the OpenID provider (OP) through your credentials.
    oauth-login
    1. You will then be logged into WELLDONE zkWallet, Sui's first Web wallet, as shown below. A new address is created using the Public Key of the extension wallet, JWT, and User Salt. We do not know the key pair of this address. However, by controlling it through independent elements like the wallet's key and OP authentication, we achieve robust security.
    check-address
    1. Receive SUI coins through the faucet and execute a Stake TX.
    send-tx
    1. Sign the transaction with the Private Key of the account in the browser extension wallet.
    sign-tx
    1. You can confirm that the transaction has been successfully sent and the stake has been executed.
    check-result

    The process outlined above can be summarized as follows:

    process

    Additionally, as shown in the image below, the "Add Wallet" feature allows the creation of multiple account addresses. This is possible because changing only the User's Salt can generate multiple account addresses with a single JWT.

    add-wallet

    For detailed explanations of the terminology and internal workings, refer to the Sui documentation.

    Conclusion

    We have explored the operation of the Sui web wallet using Sui's zkLogin feature. The separation of the extension wallet and zkLogin authentication process increases compatibility with various wallet options. Users can choose their preferred wallet, and WELLDONE zkWallet's authentication system seamlessly integrates with these diverse wallets. This provides users with more choices and caters to a variety of user needs. Extension wallets, which require management of mnemonics or private keys, can be used like a Ledger wallet.

    Furthermore, the web wallet can directly interact with various Dapps. Interactions between Dapps and the web wallet can be found in this document.

    The integration of Sui zkLogin with WELLDONE zkWallet enables users to use blockchain technology more safely and intuitively. WELLDONE zkWallet, through this innovation, enhances the practicality and security of blockchain technology, elevating the user experience to a new level.

    - + \ No newline at end of file diff --git a/wallet/developer-guide/execute-the-contract/ethereum-celo-klaytn/index.html b/wallet/developer-guide/execute-the-contract/ethereum-celo-klaytn/index.html index 7a4fb1b1a..7c102afc8 100644 --- a/wallet/developer-guide/execute-the-contract/ethereum-celo-klaytn/index.html +++ b/wallet/developer-guide/execute-the-contract/ethereum-celo-klaytn/index.html @@ -8,13 +8,13 @@ - +

    Ethereum, Celo, Klaytn

    tip

    The EVM-compatible networks, such as Ethereum, Celo, and Klaytn, extract ABI (Application Binary Interface) when the contract is deployed, implying that using a dedicated library such as ethers.js and web3.js

    Ethers

    Params

    new ethers.Contract( address , abi , providerOrSigner )

    • address - String: A contract address to be requested
    • abi - Object: JSON interface for contracts
    • providerOrSigner : A provider or signer that is instantiated by constructor
    // Read-Only; By connecting to a Provider, allows:
    // - Any constant function
    // - Querying Filters
    // - Populating Unsigned Transactions for non-constant methods
    // - Estimating Gas for non-constant (as an anonymous sender)
    // - Static Calling non-constant methods (as anonymous sender)
    const myContract = new ethers.Contract(address, abi, provider);

    // Read-Write; By connecting to a Signer, allows:
    // - Everything from Read-Only (except as Signer, not anonymous)
    // - Sending transactions for non-constant functions
    const myContract_rw = new ethers.Contract(address, abi, signer);

    web3.js

    Params

    new web3.eth.Contract(jsonInterface[, address][, options])

    • jsonInterface - Object: JSON interface for contracts
    • address - String (optional): A contract address to be requested
    • options - Object (optional): The options for a contract
      • from - String: The address that sends a transaction
      • gasPrice - String: Gas price to be payed in a transaction
      • gas - Number: gas limit
      • data - String: Contract Bytecode
    const myContract = new web3.eth.Contract([...], '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', {
    from: '0x1234567890123456789012345678901234567891', // default from address
    gasPrice: '20000000000' // default gas price in wei, 20 gwei in this case
    });
    info

    Visit the official docs for further information.

    - + \ No newline at end of file diff --git a/wallet/developer-guide/execute-the-contract/near/index.html b/wallet/developer-guide/execute-the-contract/near/index.html index 73f2c84bd..3dabe56a7 100644 --- a/wallet/developer-guide/execute-the-contract/near/index.html +++ b/wallet/developer-guide/execute-the-contract/near/index.html @@ -8,7 +8,7 @@ - + @@ -143,7 +143,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/getting-started/connecting-to-wallet/index.html b/wallet/developer-guide/getting-started/connecting-to-wallet/index.html index bd2d45643..41c3a2de0 100644 --- a/wallet/developer-guide/getting-started/connecting-to-wallet/index.html +++ b/wallet/developer-guide/getting-started/connecting-to-wallet/index.html @@ -8,7 +8,7 @@ - + @@ -65,7 +65,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/getting-started/detecting-provider/index.html b/wallet/developer-guide/getting-started/detecting-provider/index.html index c4d22f1de..bfb34a4a8 100644 --- a/wallet/developer-guide/getting-started/detecting-provider/index.html +++ b/wallet/developer-guide/getting-started/detecting-provider/index.html @@ -8,7 +8,7 @@ - + @@ -61,7 +61,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/index.html b/wallet/developer-guide/index.html index 6ec950363..54204c278 100644 --- a/wallet/developer-guide/index.html +++ b/wallet/developer-guide/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/wallet/developer-guide/provider-api/chain-names/index.html b/wallet/developer-guide/provider-api/chain-names/index.html index 7e3969b2d..c06156142 100644 --- a/wallet/developer-guide/provider-api/chain-names/index.html +++ b/wallet/developer-guide/provider-api/chain-names/index.html @@ -8,13 +8,13 @@ - +

    Chain Names

    The chain name that we support is as follows. These names are included in our provider method's CHAIN_NAME argument to allow access to the multi-networks using the same interface.

    Chain NameChainHD Path
    celestiaCelestiam/44'/118'/0'/0/ (celestia's default hd path)
    celoCelom/44'/52752'/0'/0/ (celo's default hd path)
    m/44'/60'/0'/0/ (ethereum compatible hd path)
    cosmosCosmosm/44'/118'/0'/0/ (cosmos's default hd path)
    ethereumEthereumm/44'/60'/0'/0/ (ethereum compatible hd path)
    junoJunom/44'/118'/0'/0/ (juno's default hd path)
    klaytnKlaytnm/44'/8217'/0'/0/ (klaytn's default hd path)
    m/44'/60'/0'/0/ (ethereum's default hd path)
    nearNEARm/44'/397'/0'/0/ (near's default hd path)
    neonNeonm/44'/60'/0'/0/ (ethereum compatible hd path)
    solanaSolanam/44'/501'/0'/0/ (solana's default hd path)
    - + \ No newline at end of file diff --git a/wallet/developer-guide/provider-api/events/index.html b/wallet/developer-guide/provider-api/events/index.html index c43e80e86..30395d24e 100644 --- a/wallet/developer-guide/provider-api/events/index.html +++ b/wallet/developer-guide/provider-api/events/index.html @@ -8,13 +8,13 @@ - +

    Events

    info

    Universal Provider emits two events through the EventEmitter API on Node.js.

    1. accountsChanged

    • The dapp:accountsChanged event is triggered when an account change is detected inside the network. Returns the changed account address address and current chain name CHAIN_NAME in the form CHAIN_NAME:address as the input argument from a callback function.
    type CHAIN_NAME = 'celestia' | 'celo' | 'cosmos' | 'ethereum' | 'juno' | 'klaytn' | 'near' | 'neon' | 'solana';

    window.dapp.on('dapp:accountsChanged', (currentAccount: string) => {
    console.log(currentAccount); // near:welldone.testnet
    });

    2. chainChanged

    • The dapp:chainChanged event is triggered when a network change inside the chain is identified. Returns the network ID networkID and current chain name CHAIN_NAME in the form CHAIN_NAME:networkID as modified by the input argument on a callback function.
    type CHAIN_NAME = 'celestia' | 'celo' | 'cosmos' | 'ethereum' | 'juno' | 'klaytn' | 'near' | 'neon' | 'solana';

    window.dapp.on('dapp:chainChanged', (currentNetwork: string) => {
    console.log(currentNetwork); //celo:0xf370
    });
    - + \ No newline at end of file diff --git a/wallet/developer-guide/provider-api/how-we-wrap-for-multichain/index.html b/wallet/developer-guide/provider-api/how-we-wrap-for-multichain/index.html index 1766cd5fd..82f16607c 100644 --- a/wallet/developer-guide/provider-api/how-we-wrap-for-multichain/index.html +++ b/wallet/developer-guide/provider-api/how-we-wrap-for-multichain/index.html @@ -8,13 +8,13 @@ - +

    About Universal Provider

    How does the Universal Provider wrap for multi-chain developers?

    Since Universal Provider supports multi-chain environments, Web3 developers may simply manage their development environments by utilizing WELLDONE Wallet, without having to install and maintain numerous libraries. The provider injects libraries supported by each blockchain network, such as Ethereum's ethers.js, NEAR's near-api-js, Cosmos' cosmjs, Solana's web3.js, Celo's ContractKit, Polkadot's util-crypto, and others.

    Since it is directly linked to the developer-friendly WELLDONE Wallet, Universal Provider offers middleware that captures and processes multiple requests from a plethora of networks sent from the frontend of the wallet. For example, if you would like to execute a transaction to Neon network, for example, you merely need to utilize the dapp:signAndSendTransaction method. The method helps your request to be routed to WELLDONE Wallet that wraps the libraries from a plethora of blockchain networks. Universal Provider covers and generalizes all network-related methods in this way, eliminating the need to manage each separate library. Just designate the network that you wish to query or request with a single dapp command. In the following sections, you can read more about the Universal Provider's supported methods.

    const DAPP_GET_ACCOUNT_METHOD = 'dapp:accounts';

    async function handleGetAccount() {
    try {
    const accounts = await dapp.request(CHAIN_NAME, {
    method: DAPP_GET_ACCOUNT_METHOD,
    });
    setAccounts(accounts[CHAIN_NAME].address);
    } catch (error) {
    alert(error.message);
    }
    }

    Universal Provider also supports the default API method that is already frequently utilized in web3 developer world. When developing your own multi-chain dApps, you do not need to worry about maintaining a slew of development dependencies since you only need to inject the Universal Provider to support a plethora of networks. For example, you may use the existing eth_accounts methods to query all addresses from the Ethereum blockchain. Simply browse the official document, choose the API method, and apply it to the Universal Provider. These solutions are straightforward, making web3 development easy.

    - + \ No newline at end of file diff --git a/wallet/developer-guide/provider-api/method/index.html b/wallet/developer-guide/provider-api/method/index.html index e13b4bb6b..e3e20ff9c 100644 --- a/wallet/developer-guide/provider-api/method/index.html +++ b/wallet/developer-guide/provider-api/method/index.html @@ -8,7 +8,7 @@ - + @@ -558,7 +558,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/aptos/index.html b/wallet/developer-guide/sending-transaction/aptos/index.html index ef0c3e402..4d1dcb411 100644 --- a/wallet/developer-guide/sending-transaction/aptos/index.html +++ b/wallet/developer-guide/sending-transaction/aptos/index.html @@ -8,7 +8,7 @@ - + @@ -156,7 +156,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/celestia/index.html b/wallet/developer-guide/sending-transaction/celestia/index.html index db33dc811..619a8db9e 100644 --- a/wallet/developer-guide/sending-transaction/celestia/index.html +++ b/wallet/developer-guide/sending-transaction/celestia/index.html @@ -8,7 +8,7 @@ - + @@ -136,7 +136,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/celo/index.html b/wallet/developer-guide/sending-transaction/celo/index.html index e8961c76d..a3e928c98 100644 --- a/wallet/developer-guide/sending-transaction/celo/index.html +++ b/wallet/developer-guide/sending-transaction/celo/index.html @@ -8,7 +8,7 @@ - + @@ -110,7 +110,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/cosmos/index.html b/wallet/developer-guide/sending-transaction/cosmos/index.html index 1faf21078..469c2e3df 100644 --- a/wallet/developer-guide/sending-transaction/cosmos/index.html +++ b/wallet/developer-guide/sending-transaction/cosmos/index.html @@ -8,7 +8,7 @@ - + @@ -136,7 +136,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/ethereum/index.html b/wallet/developer-guide/sending-transaction/ethereum/index.html index 495c46e4f..d5ebf164a 100644 --- a/wallet/developer-guide/sending-transaction/ethereum/index.html +++ b/wallet/developer-guide/sending-transaction/ethereum/index.html @@ -8,7 +8,7 @@ - + @@ -114,7 +114,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/injective/index.html b/wallet/developer-guide/sending-transaction/injective/index.html index 38bd1312e..f2f603896 100644 --- a/wallet/developer-guide/sending-transaction/injective/index.html +++ b/wallet/developer-guide/sending-transaction/injective/index.html @@ -8,7 +8,7 @@ - + @@ -142,7 +142,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/klaytn/index.html b/wallet/developer-guide/sending-transaction/klaytn/index.html index 61b34db25..7d72763a9 100644 --- a/wallet/developer-guide/sending-transaction/klaytn/index.html +++ b/wallet/developer-guide/sending-transaction/klaytn/index.html @@ -8,7 +8,7 @@ - + @@ -110,7 +110,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/near/index.html b/wallet/developer-guide/sending-transaction/near/index.html index 04b30c2fd..6c6d93af5 100644 --- a/wallet/developer-guide/sending-transaction/near/index.html +++ b/wallet/developer-guide/sending-transaction/near/index.html @@ -8,7 +8,7 @@ - + @@ -140,7 +140,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/neon/index.html b/wallet/developer-guide/sending-transaction/neon/index.html index 10e1cbe5f..7bee317f0 100644 --- a/wallet/developer-guide/sending-transaction/neon/index.html +++ b/wallet/developer-guide/sending-transaction/neon/index.html @@ -8,7 +8,7 @@ - + @@ -114,7 +114,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/neutron/index.html b/wallet/developer-guide/sending-transaction/neutron/index.html index c47ad7010..55ea073f6 100644 --- a/wallet/developer-guide/sending-transaction/neutron/index.html +++ b/wallet/developer-guide/sending-transaction/neutron/index.html @@ -8,7 +8,7 @@ - + @@ -136,7 +136,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/solana/index.html b/wallet/developer-guide/sending-transaction/solana/index.html index a8a00eb7a..140c27e72 100644 --- a/wallet/developer-guide/sending-transaction/solana/index.html +++ b/wallet/developer-guide/sending-transaction/solana/index.html @@ -8,7 +8,7 @@ - + @@ -137,7 +137,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/developer-guide/sending-transaction/sui/index.html b/wallet/developer-guide/sending-transaction/sui/index.html index e197ef238..be9d8c58f 100644 --- a/wallet/developer-guide/sending-transaction/sui/index.html +++ b/wallet/developer-guide/sending-transaction/sui/index.html @@ -8,7 +8,7 @@ - + @@ -196,7 +196,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/index.html b/wallet/index.html index d4b698871..c8df3d171 100644 --- a/wallet/index.html +++ b/wallet/index.html @@ -8,13 +8,13 @@ - +

    Wallet

    WELLDONE Wallet is an integrated, non-custodial wallet that allows you to freely manage your assets across any network. Navigate smoothly between chains and explore what Web3 has to offer. All your eggs in one basket.

    Currently supports a total of nine industry leaders: Aptos, Celestia, Celo, Cosmos, Ethereum, Juno, Klaytn, NEAR, Neon, Solana and Sui. Expect to see more EVM-compatible chains, Cosmos-based chains. And that’s just the beginning.

    - + \ No newline at end of file diff --git a/wallet/manual/how-to-add-a-token/index.html b/wallet/manual/how-to-add-a-token/index.html index 8418f4c44..6a0db01ad 100644 --- a/wallet/manual/how-to-add-a-token/index.html +++ b/wallet/manual/how-to-add-a-token/index.html @@ -8,13 +8,13 @@ - +

    How to Add a Token

    Add Token

    Step 1: Click Add New Token button on the account page.

    Step 2: If you enter a token contract, the remaining token data is automatically filled out. You can check the completed detail and edit the token name and token symbol.

    Step 3: Click Accept button to add token.

    7_17_2
    note

    For Solana, you must rent a user token before using it. In other words, when you add a token for the first time, you need a fee for rent once. If it is your first time using the token you are trying to add, the fee will be consumed in the process above.

    Edit & Hide Token

    note

    The token that WELLDONE Wallet provides by default cannot be changed or removed, however, you are always free to change or remove the token that you have created.

    Step 1: Click the token you want to modify in account page.

    Step 2: Click Edit button on token window.

    7_37_4

    Edit Token

    Click the Save button after changing the token name and symbol.

    7_5

    Hide Token

    Click Hide Token button to delete the token from your wallet.

    7_6
    - + \ No newline at end of file diff --git a/wallet/manual/how-to-create-a-wallet/index.html b/wallet/manual/how-to-create-a-wallet/index.html index ddbaa428c..8381e82b5 100644 --- a/wallet/manual/how-to-create-a-wallet/index.html +++ b/wallet/manual/how-to-create-a-wallet/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ 2_1_4

    note

    If you leak mnemonic, you may lose the assets in your account. If you lose your mnemonic, you cannot recover your account. Therefore, you must keep the mnemonic safe. Make sure that the word is spelled correctly and the words are in the correct order.

    Create a wallet by importing existing mnemonic phrase

    Step 1: Click the Import Wallet button on the wallet’s welcome screen.

    Step 2: Click the Next button after entering your mnemonic.

    2_2_1 2_2_2

    Step 3: Create a password and click the Create a Wallet button.

    Step 4: The wallet creation is complete if the welcome notice window appears as follows.

    2_2_3 2_2_4

    - + \ No newline at end of file diff --git a/wallet/manual/how-to-create-an-account/index.html b/wallet/manual/how-to-create-an-account/index.html index cf184eadb..3f2fa99f1 100644 --- a/wallet/manual/how-to-create-an-account/index.html +++ b/wallet/manual/how-to-create-an-account/index.html @@ -8,7 +8,7 @@ - + @@ -18,7 +18,7 @@ frame4

    note

    HD Path is a concept created to create multiple accounts from a single mnemonic. Different HD Paths produce different account addresses even with the same mnemonic. Different account addresses are created from the same mnemonic because various chains use different HD Paths as a standard.

    But more than one HD Path could be used in a single chain. For example, in the case of Celo, there is a default HD Path of Celo, but there are users who use Celo with Metamask that uses Ethereum HD Path. As a result, WELLDONE Wallet allows users to choose their own HD Path within the chain to support these different cases. We also allow you to adjust the Index, the last item in HD Path.

    Create an account with Private Key

    Step 1: Select a chain that you want to add

    Step 2: Click Import Private Key button (You can typically choose it if you use an account that you have already used.)

    frame1 frame5

    Step 3: Create an account name that is an alias to use in your wallet. Enter the Private Key, check the account address created, and click the Add Account button.

    frame6

    Create an account in NEAR

    Most chains can create accounts using the above methods, but NEAR requires several additional steps when creating accounts using the Keystore.

    Step 1: Click the Create New button and input the AccountID if you do not already have an account associated to the Address. To create a testnet account, choose .testnet, and to create a mainnet account, choose .near.

    3_3_1 3_3_2

    note

    NEAR has a human-readable ID, so you must enter a non-overlapping account ID value, and you must send a certain amount of NEAR tokens to the account in order to activate the account. Request NEAR testnet faucet at the following link.

    Step 2: Once the token is confirmed to have entered your account, the Create New button is activated as shown below. Click the button to create a NEAR account.

    3_3_3

    note

    In addition to the tokens you send to activate your first account, you need a certain amount of tokens to use that account to deploy contracts and execute transactions. For testnet accounts, you can request NEAR testnet faucet through the FAUCET tab in the wallet.

    - + \ No newline at end of file diff --git a/wallet/manual/how-to-export-a-private-key/index.html b/wallet/manual/how-to-export-a-private-key/index.html index 711cc35bc..a61bb8cfc 100644 --- a/wallet/manual/how-to-export-a-private-key/index.html +++ b/wallet/manual/how-to-export-a-private-key/index.html @@ -8,13 +8,13 @@ - +

    How to Export a Private Key

    Step 1: On the Account page, click the More icon next to the account name to access the Account details page.

    Step 2: On the Account details page, click the View icon.

    8_18_2

    Step 3: To view the Private Key, enter a password to confirm the ownership of your account.

    Step 4: After you enter your password, you will see the Private Key. Click the Copy button.

    8_38_4
    - + \ No newline at end of file diff --git a/wallet/manual/how-to-install/index.html b/wallet/manual/how-to-install/index.html index 636a56d58..07078750c 100644 --- a/wallet/manual/how-to-install/index.html +++ b/wallet/manual/how-to-install/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/wallet/manual/how-to-manage-a-network/index.html b/wallet/manual/how-to-manage-a-network/index.html index fd4d7faf2..ca9c01149 100644 --- a/wallet/manual/how-to-manage-a-network/index.html +++ b/wallet/manual/how-to-manage-a-network/index.html @@ -8,13 +8,13 @@ - +

    How to Manage a Network

    Switch Network

    Step 1: Click in the Network section of the Accounts page to bring up the Select Network box.

    Step 2: Select the network you want to change.

    6_16_2

    Add Network

    There are two ways to add a network from your wallet: 1) to use the Add Chain site provided by WELLDONE Wallet, and 2) to add network information directly.

    Using the Add Chain Site

    Using Add Chain site allows users to easily add networks to their wallets without having to enter network information. Please refer to the following link for the detailed manual using the Add Chain site.

    Add Network in WELLDONE Wallet directly

    Step 1: Click the Add Network button on Select Network window.

    Step 2: Enter the network information yourself and click the Add button.

    6_36_4
    note

    The networks that WELLDONE Wallet provides by default cannot be changed or removed, however, you are always free to change or remove networks that you have created.

    Edit Network

    Step 1: Click the Edit icon for the network that you want to modify in the Select Network window.

    Step 2: Modify the network name, currency symbol, explorer link, and click the Save button to save the changed network information. You can remove the network and register a new one if you want to modify the chain ID and RPC URL.

    6_56_6

    Delete Network

    Step 1: Click the Delete icon for the network that you want to delete in the Select Network window.

    Step 2: After double-checking and clicking the red Delete icon, the network will be deleted.

    6_76_8
    - + \ No newline at end of file diff --git a/wallet/manual/how-to-send-tokens/index.html b/wallet/manual/how-to-send-tokens/index.html index 36d2dec53..ccbff018a 100644 --- a/wallet/manual/how-to-send-tokens/index.html +++ b/wallet/manual/how-to-send-tokens/index.html @@ -8,7 +8,7 @@ - + @@ -17,7 +17,7 @@ 4_2

    Step 3: On the account page, click the Send icon next to the token you want to send.

    Step 4: An estimated fee appears when you enter the amount of tokens to send and receiving account address on the transfer page. Click the Send Token button after you have double-checked the fees, chain, network, and token informations.

    4_3 4_4

    Step 5: By clicking the Explorer button on the next screen after the token transfer is complete, you may see the current status of the transaction you just sent.

    4_5 4_6

    - + \ No newline at end of file diff --git a/wallet/manual/how-to-use-bridges/index.html b/wallet/manual/how-to-use-bridges/index.html index 550b3d869..4ab6b6fb3 100644 --- a/wallet/manual/how-to-use-bridges/index.html +++ b/wallet/manual/how-to-use-bridges/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/wallet/manual/how-to-use-bridges/neon-portal/index.html b/wallet/manual/how-to-use-bridges/neon-portal/index.html index c9d939a6f..bedbedc55 100644 --- a/wallet/manual/how-to-use-bridges/neon-portal/index.html +++ b/wallet/manual/how-to-use-bridges/neon-portal/index.html @@ -8,13 +8,13 @@ - +

    Neon Portal

    Neon is Solana’s EVM project. The Neon Portal is the bridge between Neon and Solana. You can use the Neon Portal to move assets between Solana and Neon.

    Go to the account page where you want to use the bridge.

    Step 1: Select a chain.

    Step 2: Choose the account you want to move.

    5_15_2

    Step 3: On the account page, click the token that you want to transfer to the bridge.

    Step 4: On the token page, Click the Bridge button.

    5_35_4

    Step 5: On the Bridge page, select the bridge and click the Next button.

    Step 6: An estimated fee appears when you enter the amount of tokens to send and receiving account address on the transfer page. Click the Send Token button after you have double-checked the fees, chain, network, and token informations.

    note

    To prevent the transfer using bridge to the wrong address, WELLDONE Wallet allows you to use the bridge only among the accounts in your wallet. Therefore, you must create an account on the receiving chain to use the bridge. Neon Portal is currently available on Solana devnet and Neon devnet.

    5_55_6

    Step 7: By clicking the Explorer button on the next screen after the bridge transfer is complete, you may see the current status of the transaction you just sent.

    5_7

    5_8

    - + \ No newline at end of file diff --git a/wallet/manual/index.html b/wallet/manual/index.html index 89d46217c..a7411e65d 100644 --- a/wallet/manual/index.html +++ b/wallet/manual/index.html @@ -8,13 +8,13 @@ - + - + \ No newline at end of file diff --git a/wallet/zkWallet/get-account/index.html b/wallet/zkWallet/get-account/index.html index 1d5169fa6..e3b3c1861 100644 --- a/wallet/zkWallet/get-account/index.html +++ b/wallet/zkWallet/get-account/index.html @@ -8,7 +8,7 @@ - + @@ -66,7 +66,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/zkWallet/index.html b/wallet/zkWallet/index.html index 592398062..55b5ca766 100644 --- a/wallet/zkWallet/index.html +++ b/wallet/zkWallet/index.html @@ -8,13 +8,13 @@ - +

    zkWallet

    Prerequisites
    • Currently, as it is in Alpha version, to ensure smooth interaction with DApps, you need to create an account and log in to zkWallet according to the instructions provided here. We apologize for any inconvenience caused.

    In this section, we provide an overview of how developers can effectively integrate their decentralized applications (DApps) with WELLDONE zkWallet. zkWallet is an innovative web wallet that allows users to access blockchain services using their Web2 credentials. This integration enables users to utilize blockchain functionalities more easily and securely.

    For more detailed information and step-by-step instructions, refer to the WELLDONE zkWallet documentation.

    process
    - + \ No newline at end of file diff --git a/wallet/zkWallet/send-transaction/index.html b/wallet/zkWallet/send-transaction/index.html index 96f265344..53674dc6c 100644 --- a/wallet/zkWallet/send-transaction/index.html +++ b/wallet/zkWallet/send-transaction/index.html @@ -8,7 +8,7 @@ - + @@ -108,7 +108,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file diff --git a/wallet/zkWallet/sign-transaction/index.html b/wallet/zkWallet/sign-transaction/index.html index d62f931fc..dd88346b7 100644 --- a/wallet/zkWallet/sign-transaction/index.html +++ b/wallet/zkWallet/sign-transaction/index.html @@ -8,7 +8,7 @@ - + @@ -170,7 +170,7 @@ } }
    Result
    Loading...
    - + \ No newline at end of file