tonweb
Version:
TonWeb - JavaScript API for TON blockchain
275 lines (231 loc) • 17.1 kB
JavaScript
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();