UNPKG

tonweb

Version:

TonWeb - JavaScript API for TON blockchain

275 lines (231 loc) 17.1 kB
const TonWeb = require("./index"); const {DnsCollection} = require("./contract/dns/DnsCollection"); const {DnsItem} = require("./contract/dns/DnsItem"); const {createOffchainUriCell} = require("./contract/token/nft/NftUtils"); const {BN, sha256, bytesToHex} = require("./utils"); const {Cell} = require("./boc"); const {Contract} = require("./contract"); class DnsRoot extends Contract { constructor(provider) { const options = {}; options.wc = -1; options.code = options.code || Cell.oneFromBoc('B5EE9C7241020801000164000114FF00F4A413F4BCF2C80B0102016202030202CD040502FBA1C619DBF66041AE92F152118001E5C08C41AE140F800043AE92418010A4416128BE06F0DBC0432A05A60E6205BDDA89A1F481F481F48060E04191166E8DEDD19E2D960F166EEEEEF19E2D960F93A049847F1C484DAE3A7E038E0B1C326ABE070401752791961EB19E2D920322F122E1C54C7003B663C06122B7C4E1911306070005D2F81C00936483001258C2040FA201938083001658C20407D200CB8083001A58C204064200A38083001E58C20404B2007B8083002258C204032200538083002650C20191EB83002A4E00C9D781E9C60006746F6E00E6CF16CB07C9D023C21F8E2425D71D1F01C7058E193031328200BA93C8CB0F58CF16C90191789170E2A61801DB31E031923031E27020C88B26D658CF16CB078B1748CF16CB07C9D002C2278E2103D71D2701C7058E168200BA93C8CB0F58CF16C90191789170E2A62001DB31E05B925F04E2706DD3153191'); super(provider, options); } /** * @override * @private * @return {Cell} */ createDataCell() { const cell = new Cell(); cell.bits.writeAddress(new TonWeb.Address('EQC3dNlesgVD8YbAazcauIrXBPfiVhMMr5YYk2in0Mtsz0Bz')); cell.bits.writeAddress(new TonWeb.Address('EQCA14o1-VWhS2efqoh_9M1b_A9DtKTuoqfmkn83AbJzwnPi')); cell.bits.writeAddress(new TonWeb.Address('EQB43-VCmf17O7YMd51fAvOjcMkCw46N_3JMCoegH_ZDo40e')); return cell; } } async function init() { const tonweb = new TonWeb(new TonWeb.HttpProvider('https://testnet.toncenter.com/api/v2/jsonRPC', {apiKey: ''})); const dnsResolve = async () => { // const testnetRootDnsAddress = 'Ef_v5x0Thgr6pq6ur2NvkWhIf4DxAxsL-Nk5rknT6n99oPKX'; // const mainnetRootDnsAddress = 'Ef-OJd0IF0yc0xkhgaAirq12WawqnUoSuE9RYO3S7McG6lDh'; const rootAddress = await tonweb.dns.getRootDnsAddress(); console.log('rootAddress=', rootAddress.toString(true, true, true)); const s = 'apple.ton'; // const cell = await tonweb.dns.resolve(s, TonWeb.dns.DNS_CATEGORY_NEXT_RESOLVER, true); // console.log(cell.toString(true, true, true)); const result = await tonweb.dns.getWalletAddress('foundation.ton'); console.log(result?.toString(true, true, true)); } const seed = TonWeb.utils.base64ToBytes('vt58J2v6FaSuXFGcyGtqT5elpVxcZ+I1zgu/GUfA5uY='); // const seed = TonWeb.utils.base64ToBytes('at58J2v6FaSuXFGcyGtqT5elpVxcZ+I1zgu/GUfA5uY='); const WALLET2_ADDRESS = 'EQB6-6po0yspb68p7RRetC-hONAz-JwxG9514IEOKw_llXd5'; const keyPair = TonWeb.utils.nacl.sign.keyPair.fromSeed(seed); const WalletClass = tonweb.wallet.all['v3R1']; const wallet = new WalletClass(tonweb.provider, { publicKey: keyPair.publicKey, wc: 0 }); const walletAddress = await wallet.getAddress(); console.log('wallet address=', walletAddress.toString(true, true, true)); const dnsRoot = new DnsRoot(tonweb.provider, {}); const dnsRootAddress = await dnsRoot.getAddress(); console.log('root address=', dnsRootAddress.toString(true, true, true)); const dnsItemCodeHex = 'B5EE9C7241022801000698000114FF00F4A413F4BCF2C80B0102016202030202CC04050201201E1F02012006070201481819020120080902015816170201200A0B000D470C8CB01C9D0801F73E09DBC400B434C0C05C6C2497C1383E903E900C7E800C5C75C87E800C7E800C3C0289ECE39397C15B088D148CB1C17CB865407E90350C1B5C3232C1FD00327E08E08418B9101A68608209E3402A4108308324CC200337A0404B20403C162A20032A41287E08C0683C00911DFC02440D7E08FC02F814D671C1462C200C00113E910C1C2EBCB8536003F88E34109B5F0BFA40307020F8256D8040708010C8CB055007CF165005FA0215CB6A12CB1FCB3F226EB39458CF17019132E201C901FB00E029C70091709509D31F50AAE221F008F82321BC24C0008E9E343A3A3B8E1636363737375135C705F2E196102510241023F823F00BE30EE0310DD33F256EB31FB0926C21E30D0D0E0F00FE302680698064A98452B0BEF2E19782103B9ACA0052A0A15270BC993682103B9ACA0019A193390805E220C2008E328210557CEA20F82510396D71708010C8CB055007CF165005FA0215CB6A12CB1FCB3F226EB39458CF17019132E201C901FB00923036E2803C23F823A1A120C2009313A0029130E24474F0091024F823F00B00D2343653CDA182103B9ACA005210A15270BC993682103B9ACA0016A1923005E220C2008E378210370FEC516D72295134544743708010C8CB055007CF165005FA0215CB6A12CB1FCB3F226EB39458CF17019132E201C901FB001CA10B9130E26D5477655477632EF00B0204C882105FCC3D145220BA8E9531373B5372C705F2E191109A104910384706401504E082101A0B9D515220BA8E195B32353537375135C705F2E19A03D4304015045033F823F00BE02182104EB1F0F9BAE3023B20821044BEAE41BAE302382782104ED14B65BA1310111200885B363638385147C705F2E19B04D3FF20D74AC20007D0D30701C000F2E19CF404300798D43040168307F417983050058307F45B30E270C8CB07F400C910354014F823F00B01FE30363A246EF2E19D8050F833D0F4043052408307F40E6FA1F2E19FD30721C00022C001B1F2E1A021C0008E9124109B1068517A10571046105C43144CDD9630103A395F07E201C0018E32708210370FEC51586D8100A0708010C8CB055007CF165005FA0215CB6A12CB1FCB3F226EB39458CF17019132E201C901FB00915BE21301FE8E7A37F8235006A1810258BC066E16B0F2E19E23D0D749F823F0075290BEF2E1975178A182103B9ACA00A120C2008E32102782104ED14B6558076D72708010C8CB055007CF165005FA0215CB6A12CB1FCB3F226EB39458CF17019132E201C901FB0093303535E2F82381012CA0F0024477F0091045103412F823F00BE05F041501F03502FA4021F001FA40D20031FA0082103B9ACA001DA121945314A0A1DE22D70B01C300209205A19135E220C2FFF2E192218E3E821005138D91C8500BCF16500DCF1671244B145448C0708010C8CB055007CF165005FA0215CB6A12CB1FCB3F226EB39458CF17019132E201C901FB00106994102C395BE20114008A8E3528F0018210D53276DB103946096D71708010C8CB055007CF165005FA0215CB6A12CB1FCB3F226EB39458CF17019132E201C901FB0093383430E21045103412F823F00B009A32353582102FCB26A2BA8E3A7082108B77173504C8CBFF5005CF161443308040708010C8CB055007CF165005FA0215CB6A12CB1FCB3F226EB39458CF17019132E201C901FB00E05F04840FF2F00093083001258C2040FA201938083001658C20407D200CB8083001A58C204064200A38083001E58C20404B2007B8083002258C204032200538083002650C20191EB83002A4E00C9D781E9C600069006AC0BC018060840EE6B2802A0060840EE6B2802A00A08418B9101A68608209E3402A410830856456F81B04A5A9D6A0192A4139200201201A1B0201201C1D0021081BA50C1B5C0838343E903E8034CFCC200017321400F3C5807E80B2CFF26000513B513434FFFE900835D2708027DFC07E9035353D0134CFCC0415C415B80C1C1B5B5B5B490415C415A0002B01B232FFD40173C59400F3C5B3333D0032CFF27B5520020120202102012024250013BBB39F00A175F07F008802027422230010A874F00A10475F07000CA959F00A6C71000DB8FCFF00A5F03802012026270013B64A5E014204EBE0FA1000C7B461843AE9240F152118001E5C08DE014206EBE0FA1A60E038001E5C339E8086007AE140F8001E5C33B84111C466105E033E04883DCB11FB64DDC4964AD1BA06B879240DC23572F37CC5CAAAB143A2FFFBC4180012660F003C003060FE81EDF4260F00306EB1583C'; const dnsCollection = new DnsCollection(tonweb.provider, { collectionContent: createOffchainUriCell('https://dns.ton.org/collection.json'), dnsItemCodeHex: dnsItemCodeHex, code: Cell.oneFromBoc('B5EE9C7241021D010002C7000114FF00F4A413F4BCF2C80B0102016202030202CC040502012017180201200607020120131402012008090201200D0E016D420C70094840FF2F0DE01D0D3030171B0925F03E0FA403001D31FED44D0D4D4303122C000E30210245F048210370FEC51BADC840FF2F080A0201200B0C00D032F82320821062E44069BCF2E0C701F00420D74920C218F2E0C8208103F0BBF2E0C92078A908C000F2E0CA21F005F2E0CB58F00714BEF2E0CC22F9018050F833206EB38E10D0F4043052108307F40E6FA131F2D0CD9130E2C85004CF16C9C85003CF1612CCC9F00C000D1C3232C072742000331C27C074C1C07000082CE500A98200B784B98C4830003CB432600201200F100201201112004F3223880875D244B5C61673C58875D2883000082CE6C070007CB83280B50C3400A44C78B98C727420007F1C0875D2638D572E882CE38B8C00B4C1C8700B48F0802C0929BE14902E6C08B08BC8F04EAC2C48B09800F05EC4EC04AC6CC82CE500A98200B784F7B99B04AEA00093083001258C2040FA201938083001658C20407D200CB8083001A58C204064200A38083001E58C20404B2007B8083002258C204032200538083002650C20191EB83002A4E00C9D781E9C600069006AC0BC018060840EE6B2802A0060840EE6B2802A00A08418B9101A68608209E3402A410830856456F81B04A5A9D6A0192A41392002015815160039D2CF8053810F805BBC00C646582AC678B387D0165B5E66664C0207D804002D007232FFFE0A33C5B25C083232C044FD003D0032C03260001B3E401D3232C084B281F2FFF27420020120191A0201201B1C0007B8B5D318001FBA7A3ED44D0D4D43031F00A7001F00B8001BB905BED44D0D4D430307FF002128009DBA30C3020D74978A908C000F2E04620D70A07C00021D749C0085210B0935B786DE0209501D3073101DE21F0035122D71830F9018200BA93C8CB0F01820167A3ED43D8CF16C90191789170E212A0018F83DF327') }); const dnsCollectionAddress = await dnsCollection.getAddress(); console.log('collection address=', dnsCollectionAddress.toString(true, true, true)); const deployRootDns = async () => { const seqno = (await wallet.methods.seqno().call()) || 0; console.log({seqno}) console.log( await wallet.methods.transfer({ secretKey: keyPair.secretKey, toAddress: dnsRootAddress.toString(true, true, true), amount: TonWeb.utils.toNano('0.1'), seqno: seqno, payload: null, // body sendMode: 3, stateInit: (await dnsRoot.createStateInit()).stateInit }).send() ); } const deployDnsCollection = async () => { const seqno = (await wallet.methods.seqno().call()) || 0; console.log({seqno}) const payload = new Cell(); payload.bits.writeUint(0x370fec51, 32); payload.bits.writeUint(0, 64); console.log( await wallet.methods.transfer({ secretKey: keyPair.secretKey, toAddress: dnsCollectionAddress.toString(true, true, true), amount: TonWeb.utils.toNano('0.5'), seqno: seqno, payload: payload, // body sendMode: 3, stateInit: (await dnsCollection.createStateInit()).stateInit }).send() ); } const getDnsCollectionInfo = async () => { const data = await dnsCollection.getCollectionData(); console.log(data); const cell = new Cell(); cell.bits.writeString('alicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicea'); const hash = await cell.hash(); const bn = new BN(bytesToHex(hash), 16); console.log(bn.toString(16)); console.log('addressByIndex=', (await dnsCollection.getNftItemAddressByIndex(new BN('6f0d5e27c981d01ba43aaf3d346a84beb1e8757b988465a325b3217ec3257af6', 16))).toString(true, true, true)); // "apple" console.log('addressByIndex=', (await dnsCollection.getNftItemAddressByIndex(new BN('b413c774757e648677382bd685a02242640b846f9dc92455a2a044b9c3279d5a', 16))).toString(true, true, true)); // "alice-alice-alice" console.log('addressByIndex=', (await dnsCollection.getNftItemAddressByIndex(new BN('8b98cad1bf9de7e1bd830ba3fba9608e6190825dddcf7edac7851ee16a692e81', 16))).toString(true, true, true)); // "alicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicea" // console.log((await nftCollection.getNftItemAddressByIndex(new BN(1))).toString(true, true, true)); console.log((await dnsCollection.resolve('alice-alice-alice', TonWeb.dns.DNS_CATEGORY_NEXT_RESOLVER, true))?.toString(true, true, true)); console.log((await dnsCollection.resolve('alicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicealicea', TonWeb.dns.DNS_CATEGORY_NEXT_RESOLVER, true))?.toString(true, true, true)); // console.log((await dnsCollection.resolve('apple'))); } const dnsItemAddress = new TonWeb.utils.Address('EQDEwJoXDBqBFI-0pvYJOuI5MEuvYthhwkl56qi5oclHMyGC'); console.log('dns item address=', dnsItemAddress.toString(true, true, true)); const dnsItem = new DnsItem(tonweb.provider, {address: dnsItemAddress}); const getDnsItemInfo = async () => { const data = await dnsCollection.methods.getNftItemContent(dnsItem); data.collectionAddress = data.collectionAddress.toString(true, true, true); data.ownerAddress = data.ownerAddress?.toString(true, true, true); console.log(data); if (!data.ownerAddress) { const auctionInfo = await dnsItem.methods.getAuctionInfo(); auctionInfo.maxBidAddress = auctionInfo.maxBidAddress.toString(true, true, true); auctionInfo.maxBidAmount = auctionInfo.maxBidAmount.toString(); console.log(auctionInfo); } const domain = await dnsItem.methods.getDomain(); console.log({domain}); const lastFillUpTime = await dnsItem.methods.getLastFillUpTime(); console.log({lastFillUpTime}); // console.log((await dnsItem.resolve('.'))); // console.log((await dnsItem.resolve('.', TonWeb.dns.DNS_CATEGORY_NEXT_RESOLVER, true))?.toString(true, true, true)); // console.log((await dnsItem.resolve('.', TonWeb.dns.DNS_CATEGORY_WALLET, true))?.toString(true, true, true)); // console.log((await dnsItem.resolve('.', TonWeb.dns.DNS_CATEGORY_WALLET, true))?.toString(true, true, true)); } const setWalletRecord = async () => { const seqno = (await wallet.methods.seqno().call()) || 0; console.log({seqno}) console.log( await wallet.methods.transfer({ secretKey: keyPair.secretKey, toAddress: dnsItemAddress.toString(true, true, true), amount: TonWeb.utils.toNano('0.1'), seqno: seqno, payload: await TonWeb.dns.DnsItem.createChangeContentEntryBody({category: TonWeb.dns.DNS_CATEGORY_WALLET, value: TonWeb.dns.createSmartContractAddressRecord(new TonWeb.Address('EQA0i8-CdGnF_DhUHHf92R1ONH6sIA9vLZ_WLcCIhfBBXwtG'))}), // body sendMode: 3, }).send() ); } const releaseDnsItem = async () => { const seqno = (await wallet.methods.seqno().call()) || 0; console.log({seqno}) const body = new Cell(); body.bits.writeUint(0x4ed14b65, 32); body.bits.writeUint(123, 64); console.log( await wallet.methods.transfer({ secretKey: keyPair.secretKey, toAddress: dnsItemAddress.toString(true, true, true), amount: TonWeb.utils.toNano('10'), seqno: seqno, payload: body, // body sendMode: 3, }).send() ); } const govDnsItem = async () => { const seqno = (await wallet.methods.seqno().call()) || 0; console.log({seqno}) const body = new Cell(); body.bits.writeUint(0x44beae41, 32); body.bits.writeUint(123, 64); console.log( await wallet.methods.transfer({ secretKey: keyPair.secretKey, toAddress: dnsItemAddress.toString(true, true, true), amount: TonWeb.utils.toNano('1'), seqno: seqno, payload: body, // body sendMode: 3, }).send() ); } const transferDnsItem = async () => { const seqno = (await wallet.methods.seqno().call()) || 0; console.log({seqno}) const amount = TonWeb.utils.toNano('0.05'); console.log( await wallet.methods.transfer({ secretKey: keyPair.secretKey, toAddress: await dnsItem.getAddress(), amount: amount, seqno: seqno, payload: await dnsItem.createTransferBody({ newOwnerAddress: new TonWeb.Address('EQBs7JfxnH2jNAlo0ytfKc77sSHQsUBzofngOkcLZyJlmm3j'), forwardAmount: TonWeb.utils.toNano('0.02'), forwardPayload: new TextEncoder().encode('gift'), responseAddress: walletAddress }), sendMode: 3, }).send() ); } const getStaticData = async () => { const seqno = (await wallet.methods.seqno().call()) || 0; console.log({seqno}) const amount = TonWeb.utils.toNano('0.05'); console.log( await wallet.methods.transfer({ secretKey: keyPair.secretKey, toAddress: await dnsItem.getAddress(), amount: amount, seqno: seqno, payload: await dnsItem.createGetStaticDataBody({ queryId: 661 }), sendMode: 3, }).send() ); } // await deployRootDns(); // await dnsResolve(); // await deployDnsCollection(); // await getDnsCollectionInfo(); // await getDnsItemInfo(); // await setWalletRecord(); // await transferDnsItem(); // await releaseDnsItem(); // await govDnsItem(); // await getStaticData(); } init();