├── img ├── favicon-16x16.png ├── favicon-32x32.png └── apple-touch-icon.png ├── .gitignore ├── LICENSE ├── README.md ├── js └── main.min.js ├── css └── main.min.css └── index.html /img/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndatg/tonstorage-dapp/HEAD/img/favicon-16x16.png -------------------------------------------------------------------------------- /img/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndatg/tonstorage-dapp/HEAD/img/favicon-32x32.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | /coverage/ 3 | /node_modules/ 4 | /test-reports/ 5 | .DS_Store 6 | *.iml 7 | .env 8 | -------------------------------------------------------------------------------- /img/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndatg/tonstorage-dapp/HEAD/img/apple-touch-icon.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 ndatg 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tonstorage-dapp 2 | This example of tonstorage-dapp which allows to create storage contracts between users and provider. 3 | 4 | [Dapp interface](https://ndatg.github.io/tonstorage-dapp/) 5 | 6 | It is expected that every storage-provider will set up it's own dapp-page to interact with users. Later it is planned to create "unifyed dapp" which allow to interact with all providers and simultaneously ensure replication. 7 | 8 | # How to use it 9 | ## Prerequisites 10 | 1. You need TON Wallet extension installed 11 | 2. If you want to host large file, you need to create Bag and obtain BagId yourself. 12 | ## Contract creation 13 | 1. Open Dapp 14 | 2. If you want to host small files you can add them via "Upload" section otherwise insert BagId into BagId input field. 15 | 3. Insert into "Initial balance" input desired amount of TONs 16 | 4. Click "Create Contract" button, it will open TON Wallet modal window, confirm transaction 17 | 5. Wait till smart contract will be deployed (check progress on timeline) 18 | 6. Wait till contract is confirmed by provider (check progress on timeline) 19 | 7. Store storage contract address 20 | ## Check storage contract 21 | 1. Open manage tab 22 | 2. Insert your storage contract address and load data 23 | 3. Check actual balance and parameters 24 | 4. Top-up balance or cancel contract if you want 25 | 26 | -------------------------------------------------------------------------------- /js/main.min.js: -------------------------------------------------------------------------------- 1 | const $=e=>document.querySelector(e);function parseTextAddress(e){var t=TonWeb.boc.CellParser.loadUint(e,2);if(0==t)return"🕳️ Null address";if(2!=t)return"Unsupported address type 1 "+t;if(0!=TonWeb.boc.CellParser.loadUint(e,1))return"Unsupported address type 2";var t=TonWeb.boc.CellParser.loadInt(e,8),a=new Uint8Array(32);for(i=0;i<32;i++)a[i]=TonWeb.boc.CellParser.loadUint(e,8);var s=new TonWeb.utils.Address("0:0000000000000000000000000000000000000000000000000000000000000000");return s.wc=t,s.hashPart=a,s.toString(!0,!0,!0,!1)}function setAccountAddress(e){$("#accountAddress").innerText=e}function resetTimeline(){$("#uploadFilesTimeline").classList.remove("timeline__item--active"),$("#uploadFilesTimeline").classList.remove("timeline__item--current"),$("#sendRequestTimeline").classList.remove("timeline__item--active"),$("#sendRequestTimeline").classList.remove("timeline__item--current"),$("#registerTimeline").classList.remove("timeline__item--active"),$("#registerTimeline").classList.remove("timeline__item--current"),$("#waitingConfTimeline").classList.remove("timeline__item--active"),$("#waitingConfTimeline").classList.remove("timeline__item--current"),$("#lastTimeline").classList.remove("timeline__item--active"),$("#lastTimeline").classList.remove("timeline__item--current")}$("#topupModalButton").onclick=function(){showTopupModal()},window.onclick=function(e){e.target==$("#topupModal")&&closeTopupModal()};const showTopupModal=function(){$("#topupModal").style.display="block"},closeTopupModal=function(){$("#topupModal").style.display="none"};function page(e,t){var a=document.getElementsByClassName("page");for(let e=0;e{var t=document.getElementById("files");clearFiles();let a="";for(let e=0;e 3 |
${s.name}
4 |
${(s.size/1e6).toFixed(2)} mb
5 | `,t.innerHTML=a}console.log(filesInput.files)}),function(){document.getElementById("files").innerHTML=""});async function errorMessage(e){$("#error .error__text").innerText="Error: "+e,$("#error").style.display="flex",await new Promise(e=>setTimeout(e,3500)),$("#error .error__text").innerText="",$("#error").style.display="none"}async function readProviderData(){try{var e,t,a,s=await fetch("https://tonstarter.org/api/getProviderInfo"),i=await s.json();console.log("provider info:"),console.log(i),s.ok?(e=new TonWeb.utils.Address(i.result.address).toString(!0,!0,!1),a=await(t=await fetch("https://tonstarter.org/api/getProviderParams")).json(),console.log("provider params:"),console.log(a),t.ok?($("#providerAddress").innerHTML=`${e}`,$("#providerStatus").innerHTML=Number(a.result.accept_new_contracts)?'
True
':'
False
',$("#providerRateSvg").style.display="flex",$("#providerRate").innerText=Number(a.result.rate_per_mb_day)/1e9,$("#providerMaxSpan").innerText=Number(a.result.max_span)+" sec",$("#providerMinFileSize").innerText=Number(a.result.minimal_file_size)+" bytes",$("#providerMaxFileSize").innerText=Number(a.result.maximal_file_size)+" bytes"):await errorMessage(a.message)):await errorMessage(i.message)}catch(e){await errorMessage("Can't get the provider data")}}$("#readProviderDataButton").addEventListener("click",readProviderData),readProviderData();const tonweb=new TonWeb(new TonWeb.HttpProvider("https://toncenter.com/api/v2/jsonRPC")),OP_NEW_STORAGE_CONTRACT=276580847,OP_TOPUP_BALANCE=213570953,OP_CLOSE_CONTRACT=2046375914,OP_CONTRACT_REGISTERED=3212562625,TOPUP_REGEXP=/^[0-9]+\.?[0-9]*$/i,BAGID_REGEXP=/^[A-F0-9]{64}$/i,ADDRESS_REGEXP=/^[-1|0]:[A-F0-9]{64}$/i,NON_BOUNCEABLE_ADDRESS_REGEXP=/^[A-Z0-9/+]{48}$/i,BOUNCEABLE_ADDRESS_REGEXP=/^[A-Z0-9_-]{48}$/i,onTonReady=async()=>{if(console.log("tonready"),!window.tonProtocolVersion||window.tonProtocolVersion<1)alert("Please, update your TON Wallet Extension");else{const d=window.ton;console.log("isTonWallet=",d.isTonWallet),d.on("accountsChanged",function(e){setAccountAddress(e[0])});var e;e=(await d.send("ton_requestAccounts"))[0],console.log(e),setAccountAddress(e),await!console.log(await d.send("ton_requestWallets")),$("#createContractButton").addEventListener("click",async()=>{try{$("#uploadFilesTimeline").classList.add("timeline__item--active"),$("#uploadFilesTimeline").classList.add("timeline__item--current");var t=document.getElementById("filesInput").files;if(0setTimeout(e,1100));for(;!a;){var s=await tonweb.provider.getTransactions(t);if(s.length){try{var i=tonweb.boc.Cell.fromBoc(tonweb.utils.base64ToBytes(s[0].in_msg.msg_data.body))[0],n=i.bits.readUint(32).toNumber(),r=i.bits.readUint(64).toNumber();n==OP_CONTRACT_REGISTERED&&e==r&&($(".msg").style.display="flex",$("#newContractAddress").innerHTML=`${s[0].in_msg.source}`,a=!0)}catch(e){console.log(e.message)}await new Promise(e=>setTimeout(e,1100))}}$("#registerTimeline").classList.remove("timeline__item--current"),$("#waitingConfTimeline").classList.add("timeline__item--active"),$("#waitingConfTimeline").classList.add("timeline__item--current"),async function(){let e=$("#newContractAddress a").innerText,t=!1;await new Promise(e=>setTimeout(e,1100));for(;!t;)-1==(await tonweb.provider.call2(e,"get_storage_contract_data",[]))[0].toNumber()&&(t=!0,$("#waitingConfTimeline").classList.remove("timeline__item--current"),$("#lastTimeline").classList.add("timeline__item--active")),await new Promise(e=>setTimeout(e,1100))}()}(i)):(resetTimeline(),await errorMessage("Please, enter the valid initial balance"))):(resetTimeline(),await errorMessage(r.message))):(resetTimeline(),await errorMessage("Please, enter the valid BAG ID"))}catch(e){resetTimeline(),await errorMessage("Can't create the contract"),console.log(e.message)}}),$("#readContractData").addEventListener("click",async function(){var e=$("#contractAddress").value;if(ADDRESS_REGEXP.test(e)||NON_BOUNCEABLE_ADDRESS_REGEXP.test(e)||BOUNCEABLE_ADDRESS_REGEXP.test(e))try{var t=await tonweb.provider.call2(e,"get_storage_contract_data",[]),a=($("#contractStatus").innerHTML=t[0].toNumber()?'
True
':'
False
',$("#contractBalance").innerText=t[1]/1e9,parseTextAddress(t[2])),s=(console.log("provider: "+a),$("#contractProvider").innerHTML=`${a}`,$("#contractFileSize").innerText=t[4],$("#contractRate").innerText=t[6]/1e9,parseTextAddress(t[9]));console.log("owner: "+s),$("#contractOwner").innerHTML=`${s}`,$("#contractData").style.display="flex",s===$("#accountAddress").innerText&&($(".block__aside").style.display="flex")}catch(e){console.log(e.message),await errorMessage("Can't get the storage contract info"),$("#contractData").style.display="none"}else await errorMessage("Please, enter the valid storage contract address")}),$("#topupButton").addEventListener("click",async()=>{var e=$("#contractAddress").value;if(ADDRESS_REGEXP.test(e)||NON_BOUNCEABLE_ADDRESS_REGEXP.test(e)||BOUNCEABLE_ADDRESS_REGEXP.test(e)){var t=$("#topupInput").value;if(console.log(t),TOPUP_REGEXP.test(t)){try{var a=new tonweb.boc.Cell,s=(a.bits.writeUint(OP_TOPUP_BALANCE,32),((new Date).getTime()/1e3).toFixed(0));a.bits.writeUint(s,64),d.send("ton_sendTransaction",[{to:e,value:1e9*t,data:tonweb.utils.bytesToBase64(await a.toBoc()),dataType:"boc"}])}catch(e){console.log(e),await errorMessage("Can't topup the contract")}closeTopupModal()}else await errorMessage("Please, enter the valid topup balance")}else await errorMessage("Please, enter the valid storage contract address")}),$("#cancelButton").addEventListener("click",async()=>{var e=$("#contractAddress").value;if(ADDRESS_REGEXP.test(e)||NON_BOUNCEABLE_ADDRESS_REGEXP.test(e)||BOUNCEABLE_ADDRESS_REGEXP.test(e)){console.log(e);try{var t=new tonweb.boc.Cell,a=(t.bits.writeUint(OP_CLOSE_CONTRACT,32),((new Date).getTime()/1e3).toFixed(0));t.bits.writeUint(a,64),d.send("ton_sendTransaction",[{to:e,value:"30000000",data:tonweb.utils.bytesToBase64(await t.toBoc()),dataType:"boc"}])}catch(e){console.log(e.message),await errorMessage("Can't cancel the contract")}}else await errorMessage("Please, enter the valid storage contract address")})}};window.ton?onTonReady():window.addEventListener("tonready",()=>onTonReady(),!1); -------------------------------------------------------------------------------- /css/main.min.css: -------------------------------------------------------------------------------- 1 | .status-true{color:#47c58a}.status-false{color:#ed6767}.link{font-weight:500;font-size:18px;line-height:28px;color:#08c;text-decoration:none}.button{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:center;justify-content:center;padding:12px 24px;cursor:pointer;outline:inherit;background:transparent;border:1px solid #e9eef1;border-radius:40px;font-weight:700;font-size:16px;line-height:24px;text-align:center;color:#04060b}.button--blue{border:1px solid #08c;background:#08c;color:#fff}.button--blue:hover{border:1px solid #0099e5;background:#0099e5;color:#fff}.button--blue:hover,.button--blue:not(:hover){transition:all .4s ease}body{min-height:100vh;min-width:100vw;margin:0;padding:0;background:#fff;font-family:Inter,sans-serif;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}.container,body{display:-ms-flexbox;display:flex}.container{width:calc(100% - 160px);max-width:1160px;margin:0 160px;-ms-flex-direction:column;flex-direction:column}.header{width:100%;height:80px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center}.logo{width:200px;font-size:20px;line-height:16px}.logo__link{width:132px;display:block;text-decoration:none}.menu{height:44px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;background:#f2f5f8;border-radius:100px;list-style:none}.menu,.menu__item{margin:0;padding:0}.menu__link{display:-ms-inline-flexbox;display:inline-flex;height:40px;padding:0 16px;margin:0 2px;text-decoration:none;font-style:normal;font-weight:600;font-size:16px;line-height:40px;color:#728a96;border-radius:100px}.menu__link--active{color:#04060b;background:#fff}.menu__link:hover{background:#fff}.menu__link:hover,.menu__link:not(:hover){transition:all .4s ease}.switches{width:200px;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:right;justify-content:right}.switches,.switches__item{height:36px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.switches__item{border-radius:10px;margin:0 0 0 4px;line-height:36px;padding:0 12px;text-decoration:none;text-align:center;cursor:pointer;font-weight:600;font-size:16px;color:#04060b}.switches__item:hover{background:#f7f9fb}.switches__item:hover,.switches__item:not(:hover){transition:all .4s ease}.lang__text{margin-left:8px}.main{width:100%;min-height:100px;padding:40px 0 0}.page{display:none}.title{font-weight:700;font-size:48px;line-height:56px;color:#04060b;margin:40px 0}.block{padding:28px 32px;background:#f7f9fb;border-radius:24px;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.block__header{-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;margin:0 0 24px}.block__aside,.block__header{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.block__aside .block__button{margin:0 0 0 16px}.block__title{font-weight:600;font-size:24px;line-height:32px;color:#04060b}.block__table{width:100%;padding:0;margin:0}.block__table-tr{line-height:28px;padding:0 0 16px;margin:0}.block__table-th{text-align:left;text-decoration:none;font-weight:400;font-size:18px;line-height:28px;color:#04060b;width:224px;padding-bottom:16px}.block__table-td{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;font-style:normal;font-weight:500;font-size:18px;line-height:28px;padding:0 0 16px 32px}.block__table-ton-icon{margin:0 6px 0 0;position:relative;top:3px}.input-block{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.manage__input-block{margin:0 0 40px}.input-block__header{font-style:normal;font-weight:400;font-size:18px;line-height:28px;color:#04060b;padding:0 0 0 32px;margin:0 0 8px}.input-block__body{box-sizing:border-box;height:64px;background:#f7f9fb;border:1px solid #f7f9fb;border-radius:40px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;position:relative}.input-block__input{display:-ms-inline-flexbox;display:inline-flex;width:calc(100% - 64px);height:calc(100% - 32px);padding:18px 32px;background:transparent;outline:none;box-shadow:none;border:1px solid transparent;border-radius:40px;font-weight:400;font-size:18px;line-height:28px;color:#04060b}.input-block__desc{display:block;width:100%;padding:0 0 0 24px;margin:8px 0 0;text-align:left;font-weight:400;font-size:14px;line-height:20px;color:#728a96}.input-block__input--width-button{padding:18px 232px 18px 32px}.input-block__input::-webkit-input-placeholder{font-weight:400;font-size:18px;line-height:28px;color:#c0d1d9}.input-block__input::-moz-placeholder{font-weight:400;font-size:18px;line-height:28px;color:#c0d1d9}.input-block__input:-ms-input-placeholder,.input-block__input::-ms-input-placeholder{font-weight:400;font-size:18px;line-height:28px;color:#c0d1d9}.input-block__input::placeholder{font-weight:400;font-size:18px;line-height:28px;color:#c0d1d9}.input-block__input:focus{border:1px solid #08c;box-shadow:0 0 0 6px rgba(0,136,204,.1);transition:all .2s ease}.input-block__input:not(:focus){transition:all .2s ease}.input-block__button{padding:14px 24px;position:absolute;right:6px}.msg{width:calc(100% - 64px);padding:28px 32px;margin:0 0 40px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;background:#f7f9fb;border-radius:24px}.msg__text{font-weight:400;font-size:18px;line-height:28px;color:#04060b}.error{width:calc(100% - 64px);padding:28px 32px;margin:0 0 40px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;background:#ffebee;border-radius:24px}.error__text{font-weight:400;font-size:18px;line-height:28px;color:#04060b}.upload-block{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.upload-block__item{width:calc(50% - 2px - 32px)}.upload-block .input-block{margin:0 0 24px}.upload-block .input-block__body{height:52px}.upload-block .input-block__input{padding:12px 20px;width:calc(100% - 40px);height:calc(100% - 24px)}.upload-block .input-block__header{font-style:normal;font-weight:400;font-size:18px;line-height:28px;color:#04060b;padding:0 0 0 20px;margin:0 0 4px}.upload-block .upload-block__button{float:right}.files-block{width:100%;max-width:544px;height:304px;border:1px dashed #dde3e6;border-radius:24px;box-sizing:border-box;gap:10px;margin:0 0 16px;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.files-block__icon{margin:-10px 0}.files-block__header{font-weight:600;font-size:20px;line-height:30px;text-align:center;color:#04060b}.files-block__desc{font-weight:400;font-size:16px;line-height:24px;text-align:center;color:#728a96}.files-block__input{display:none}.file{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:12px 20px;width:calc(100% - 40px);max-width:544px;margin:0 0 16px;background:#f7f9fb;border-radius:16px;cursor:pointer}.file__name{font-weight:400;font-size:16px;line-height:24px;color:#04060b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file__size{font-weight:400;font-size:14px;line-height:20px;color:#728a96}.footer{margin:154px 0 0}.footer-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap}.footer-col{margin:0 32px 24px 0;padding:0}.footer-col__header{margin:0 0 12px;font-weight:600;font-size:18px;line-height:28px;color:#04060b}.footer-menu{padding:0;margin:0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;list-style:none}.footer-menu__item{margin:0 0 8px}.footer-menu__link{font-weight:400;font-size:14px;line-height:20px;color:#728a96;text-decoration:none}.footer-menu__link:hover{color:#0099e5;transition:all .2s ease}.footer-menu__link:not(:hover){transition:all .2s ease}.footer-separator{height:1px;width:100%;background:#dfe5e8;opacity:.5}.footer-bottom{width:100%;min-height:28px;padding:24px 0 40px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center}.footer-bottom__logo{width:200px}.footer-bottom__copyright{font-style:normal;font-weight:400;font-size:14px;color:#728a96;opacity:.7}.footer-bottom__links{width:200px;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:right;justify-content:right}.footer-bottom__link{text-decoration:none;margin:0 0 0 10px}.footer-bottom__link:hover svg path{fill:#0099e5;transition:all .2s ease}.footer-bottom__link:not(:hover) svg path{transition:all .2s ease}.modal{display:none;position:fixed;z-index:1;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:rgba(0,0,0,.4);cursor:pointer}.modal__content{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);padding:28px 32px;width:288px;min-height:288px;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;border-radius:24px;cursor:default;background:#fff}.modal__header{margin:0 0 4px;font-weight:600;font-size:24px;line-height:32px;color:#04060b}.modal__desc,.modal__header{width:100%;text-align:center}.modal__desc{display:block;margin:0 0 24px;font-weight:400;font-size:16px;line-height:24px;color:#191f2f}.modal__input{width:100%;margin:0 0 8px}.modal__button{margin:0;width:calc(100% - 48px)}.timeline{list-style:none;-ms-flex-direction:row;flex-direction:row;padding:0;margin:0 0 40px}.timeline,.timeline__item{display:-ms-flexbox;display:flex}.timeline__item{border-top:1px solid #dde3e6;-ms-flex:1 1 0px;flex:1 1 0px;font-style:normal;font-weight:400;font-size:18px;line-height:28px;text-align:center;color:#04060b}.timeline__item:before{content:"";left:calc(100% - 4px);top:-4px;display:-ms-flexbox;display:flex;position:relative;width:8px;height:8px;background:#c0d1d9;border-radius:100%}.timeline__item:last-child:before{content:"";background:transparent;border-radius:100%}.timeline__item--active{border-top:1px solid #08c}.timeline__item--active:before{width:12px;height:12px;top:-6px;background:#08c}.timeline__text{margin:12px 0 0;width:100%;position:relative;left:115px}@keyframes a{0%{transform:rotate(0deg);transform-origin:center center}to{transform:rotate(359deg)}}.timeline__item--current:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M22 12c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2s10 4.477 10 10z' fill='%23fff'/%3E%3Cpath d='M12 3c0-.552.449-1.005.998-.95a10 10 0 0 1 1.043 19.74c-.541.112-1.035-.29-1.093-.84-.059-.55.342-1.035.88-1.162a8 8 0 0 0-.83-15.726C12.45 3.994 12 3.552 12 3z' fill='%2308C'/%3E%3Ccircle cx='12' cy='12' r='6' fill='%2308C'/%3E%3C/svg%3E");height:25px;width:25px;position:relative;background-color:transparent;border-radius:0;top:-12px;animation:a 10s linear infinite} -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | Storage - The Open Network 23 | 24 | 25 |
26 |
27 | 37 | 44 |
45 |
46 |
47 |
48 | 51 | 55 |
56 |
Create contract
57 |
    58 |
  • Upload files
  • 59 |
  • Send request
  • 60 |
  • Register contract
  • 61 |
  • Waiting for confirmation
  • 62 |
  • 63 |
64 |
65 |
66 |
67 |
68 | 69 | 70 | 71 | 72 | 73 |
74 |
Upload files
75 |
Upload file here.
Max. size: 50 mb.
76 | 77 | 78 |
79 |
80 | 81 | 82 | 83 | 84 |
85 |
86 |
87 |
88 |
Bag ID
89 |
90 | 91 |
92 |
93 |
94 |
Initial balance
95 |
96 | 97 |
98 |
total fee ≈ 0.05 TON
99 |
100 |
Create contract
101 |
102 |
103 |
104 | 105 |
106 |
Manage contracts
107 |
108 |
Storage Contract Address
109 |
110 | 111 |
Read contract data
112 |
113 |
114 | 161 |
162 | 163 |
164 |
Provider Info
165 |
166 |
167 |
Provider info
168 |
169 |
Read provider data
170 |
171 |
172 |
173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 |
ProviderNot loaded
OpenNot loaded
Rate per mb per day 185 | 188 |
Not loaded
189 |
Max. span between proofsNot loaded
Min. file sizeNot loaded
Max. file sizeNot loaded
204 |
205 |
206 |
207 |
208 | 262 |
263 | 276 | 277 | 278 | 279 | 280 | 281 | --------------------------------------------------------------------------------