UNPKG

tonweb

Version:

TonWeb - JavaScript API for TON blockchain

86 lines (72 loc) 13.2 kB
const TonWeb = require("./index"); const {Cell} = require("./boc"); const TONCENTER_API_KEY = '319256218218ff3c53398474375d0781cd81c1c9d1936ee992372845f8ebadb1'; const tonweb = new TonWeb(new TonWeb.HttpProvider('https://toncenter.com/api/v2/jsonRPC', {apiKey: TONCENTER_API_KEY})); const POOL_CODE_HEX = 'B5EE9C7241023A010009C2000114FF00F4A413F4BCF2C80B0102016202030202CE0405020120131402012006070065421D749AB02705203AA008E23AA0303F00114A002A45301BA8E1323D74AC0019C5B01D430D020D749AB021270DEDE02E46C218047F3E09DBC400B434C0FE900C083E9100DC6C23C88C4CCCC835D2708FE3C5200835C874C7CC2084139CDD12EE80B6CF2C38C02497C0F8B800F4C7F6CF1584B0002021081F09004F34C1C069B40830BFFCB852483042B729BE4830BFFCB8524830443729B80830BFC870442C3CB852600330DB3C5610C00193705711DE104C103B4A98DB3C085533DB3C1F0C12042CE30F5540DB3C105C104B103A497810561045103440330A0B0C0D03A257121110D30721C07922C06EB122C06423C077B121B1F2E04020B39E21D15616C000F2BD56152EBDF2BEDE22C064E30022C077925717E30D11168E1330041115040311140302111302571157115F03E30D0E0F1003341111D33F56165616DB3CE30F0B11100B10BF10BE10BD10BC10AB2122230028C88101001026CF0113CB0FCB0F01FA0201FA02C90104DB3C1202D8810100561652A2F40E6FA120B3951112A41112DE56122EBBF2E04182103B9ACA0001111B01A120C200F2E042111A8E82DB3C93307020E25613C0009401561AA094561AA001E25301A02CBEF2E0432AD765755614B603AA00B609B9F2E04401DB3C81010012561740BBF443082F2503A45611C0008F2156150410391028011118011111DB3C015618A18212540BE400BE8E845613DB3CDE8EA3571781010056155292F40E6FA131F2E045C88101001256164099F4435613DB3C4F0702E24F1F50770629303002FE5614C0FF56142DBAB0B38E9D1114C000F2E07981010056135272F40E6FA1F2E07ADB3C30C200F2E07B925714E211148020F00201D11113C079561356118307F40E6FA120B38E1982103B9ACA005613D76595800F7AA984E401111801BEF2E07B925717E2561695F404D31F3094306DF823E25614228307F40E6FA131F2D07C2F11016CF82303C8CA0013CB1F021114018307F443C8F40001111201CB1F02011112010F8307F44311128E830DDB3C913DE20C11100C10BF10BC30004A0CC8CB071BCB0F5009FA025007FA0215CC13F400F400CB1FCBFFCB07CB1FCB1FF400C9ED540201201516020120191A0109BBF19DB3C81F02016217180175AF3BED9E2B882F87B6ACC183FA0737D0F97042FA02183FC70FC0808029107A3E37D2904F816900698F98112CB781A802378101C8997100D9F32DC01F0109AC8B6D9E403302016E1B1C015DBBD05DB3C57105F0F6D7F8E1F228307F47C6FA5208E1002F40431D31F3052106F0250036F02029132E201B3E6303181F0201201D1E0117AE3EED9E0837AF8798B759C01F0276AA39DB3C5F06509A5F096D7F8EA98101005230F47C6FA5208E9802DB3C810100546380F40E6FA1312355206F0450036F02029132E201B3E6135F031F2F0244AB59DB3C5F06509A5F098101002359F40E6FA1F2E056DB3C8101004430F40E6FA1311F2F0154ED44D0D307D30FFA00FA00D401D0DB3C05F404F404D31FD3FFD307D31FD31FF4043010BC10AB109A108920001C810100D701D30FD30FFA00FA0030001E01C0FF71F833D0810100D70358BAB001E85B5712571257125712F8008210F96F732452E0BA8EB93B11117009A15380C1019A5088A020C100923727DE8E16305305A8812710A9045301BC923020DE5188A008A107E25077DB3C270A11110A080A925712E22AC0018E198210EE6F454C52D0BA92703BDE8210F374484C1DBA92723ADE913CE22404B85613C2005614C108B0821047657424561501BAB182104E73744B561501BAB1F2E0465613C001305613C0028F24D3071039102856180201111201DB3C5619A18212540BE400BE8E845614DB3CDE11104870DE5613C003E3005613C0062630272803BA707F8E988101005230F47C6FA5208E8702DB3C3013A0029132E201B3E6306D7F8F378101005240F47C6FA5208F2602DB3C25C2009F547715A98412A020C100923070DE01DEA070DB3C8101005412015055F443029132E201B3E6145F042F2F25000EC858FA0201FA020172707F218EB0810100542270F47C6FA532218E9C3254411348705266DB3C5217BA05A45304BE927F36DE103847634550DE01B322B112E65F0401290268810100D7018101005462A0F40E6FA131F2E0474930185618011112DB3C015619A18212540BE400BE8E845614DB3CDE1110487012293004D68F2024C103F2E071DB3C6C21F9005360BD99343503A44413F823039130E25614DB3CDE5613C0078EB7F8237F8E2C56148307F47C6FA5208E1C02F40431D31F305230A18208278D00BC9A2011168307F45B301115DE9132E201B3E65B5614DB3CDE821047657424561401BA3430302A03B2810100546550F40E6FA1F2BCDB3CA08212540BE4005230A15210BC93306C14E0810100544666F45B30810100544655F45B3001A55124A182103B9ACA005250BE8F11705006DB3C6D80101023102670DB3C1023923434E243302F393804E08F3024C201F2E06F24C202F82325A124A63CBCB1F2E070821047657424C8CB1F5220CB3FC9DB3C708018804010341023DB3CDE5613C0048E235616C0FF56162FBAB0F2E04982103B9ACA0001111901A120C200F2E04A51EEA00E1118DE5613C005925714E30D82104E73744B561301BA37382B2C04A85611C000F2E04A5616C0FF56162FBAB0F2E04BFA0021C200F2E04E29DB3C8212540BE400561A01A101A15220BBF2E04C51F1A120C100923070DE7F2FDB3C6D8010245970DB3C561858A15619A18212540BE400BE2D39382E014E8E173005111605041115040311140302111302571157115F04E30D0F11100F10EF10DE10CD10BC31013E707F8E988101005230F47C6FA5208E8702DB3CA013A0029132E201B3E630312F011C8E841114DB3C925714E20D11130D30000AFA00FA00300114706D8010804072A0DB3C3804D63E5F050FC0FF51E6BA1EB0F2E04E08C000F2E04F25F2E05082103B9ACA001FBEF2E05609FA0020DB3C82103B9ACA005230A18218746A5288005240BEF2E0518212540BE40001111001A15230BBF2E052535FBEF2E0532EDB3C5260BEF2E0542D6EF2E05571DB3C31F9007032333435001CD3FF31D31FD31F31D3FF31D431D100848028F833206E985B8218178411B200E0D0D30731FA00D31FD30FD30FD30F31D30F31D30FD30F305053A8AB075033A8AB075023A8AB0759A8AB075220A9B41FA0B60800268022F83320D0D30701C012F289D31FD31F3058035CDB3CDB3C1110C8CB1F1CCB3F5006CF16C9801871041110041038DB3C0E11100E1F103E102D10BC107B50990743133637380022800FF833D0D31F31D31F31D31F31D70B1F011A71F833D0810100D7037F01DB3C390048226EB32091719170E203C8CB055006CF165004FA02CB6A039358CC019130E201C901FB00001C74C8CB0212CA07810100CF01C9D0CA582994'; const POOL_CODE_BASE64 = TonWeb.utils.bytesToBase64(TonWeb.utils.hexToBytes(POOL_CODE_HEX)); class PoolContract extends TonWeb.Contract { constructor(provider, options) { // <{ SETCP0 ACCEPT // "pool.fif" include PUSHREF SETCODE // }>c const INIT_POOL_CODE_HEX = 'B5EE9C7241023B010009CC00010EFF00F80088FB04010114FF00F4A413F4BCF2C80B0202016203040202CE0506020120141502012007080065421D749AB02705203AA008E23AA0303F00114A002A45301BA8E1323D74AC0019C5B01D430D020D749AB021270DEDE02E46C218047F3E09DBC400B434C0FE900C083E9100DC6C23C88C4CCCC835D2708FE3C5200835C874C7CC2084139CDD12EE80B6CF2C38C02497C0F8B800F4C7F6CF1584B000202209200A004F34C1C069B40830BFFCB852483042B729BE4830BFFCB8524830443729B80830BFC870442C3CB852600330DB3C5610C00193705711DE104C103B4A98DB3C085533DB3C200D13042CE30F5540DB3C105C104B103A497810561045103440330B0C0D0E03A257121110D30721C07922C06EB122C06423C077B121B1F2E04020B39E21D15616C000F2BD56152EBDF2BEDE22C064E30022C077925717E30D11168E1330041115040311140302111302571157115F03E30D0F101103341111D33F56165616DB3CE30F0B11100B10BF10BE10BD10BC10AB2223240028C88101001026CF0113CB0FCB0F01FA0201FA02C90104DB3C1302D8810100561652A2F40E6FA120B3951112A41112DE56122EBBF2E04182103B9ACA0001111B01A120C200F2E042111A8E82DB3C93307020E25613C0009401561AA094561AA001E25301A02CBEF2E0432AD765755614B603AA00B609B9F2E04401DB3C81010012561740BBF44308302603A45611C0008F2156150410391028011118011111DB3C015618A18212540BE400BE8E845613DB3CDE8EA3571781010056155292F40E6FA131F2E045C88101001256164099F4435613DB3C4F0702E24F1F5077062A313102FE5614C0FF56142DBAB0B38E9D1114C000F2E07981010056135272F40E6FA1F2E07ADB3C30C200F2E07B925714E211148020F00201D11113C079561356118307F40E6FA120B38E1982103B9ACA005613D76595800F7AA984E401111801BEF2E07B925717E2561695F404D31F3094306DF823E25614228307F40E6FA131F2D07C3012016CF82303C8CA0013CB1F021114018307F443C8F40001111201CB1F02011112010F8307F44311128E830DDB3C913DE20C11100C10BF10BC31004A0CC8CB071BCB0F5009FA025007FA0215CC13F400F400CB1FCBFFCB07CB1FCB1FF400C9ED5402012016170201201A1B0109BBF19DB3C82002016218190175AF3BED9E2B882F87B6ACC183FA0737D0F97042FA02183FC70FC0808029107A3E37D2904F816900698F98112CB781A802378101C8997100D9F32DC0200109AC8B6D9E403402016E1C1D015DBBD05DB3C57105F0F6D7F8E1F228307F47C6FA5208E1002F40431D31F3052106F0250036F02029132E201B3E630318200201201E1F0117AE3EED9E0837AF8798B759C0200276AA39DB3C5F06509A5F096D7F8EA98101005230F47C6FA5208E9802DB3C810100546380F40E6FA1312355206F0450036F02029132E201B3E6135F0320300244AB59DB3C5F06509A5F098101002359F40E6FA1F2E056DB3C8101004430F40E6FA13120300154ED44D0D307D30FFA00FA00D401D0DB3C05F404F404D31FD3FFD307D31FD31FF4043010BC10AB109A108921001C810100D701D30FD30FFA00FA0030001E01C0FF71F833D0810100D70358BAB001E85B5712571257125712F8008210F96F732452E0BA8EB93B11117009A15380C1019A5088A020C100923727DE8E16305305A8812710A9045301BC923020DE5188A008A107E25077DB3C270A11110A080A925712E22AC0018E198210EE6F454C52D0BA92703BDE8210F374484C1DBA92723ADE913CE22504B85613C2005614C108B0821047657424561501BAB182104E73744B561501BAB1F2E0465613C001305613C0028F24D3071039102856180201111201DB3C5619A18212540BE400BE8E845614DB3CDE11104870DE5613C003E3005613C0062731282903BA707F8E988101005230F47C6FA5208E8702DB3C3013A0029132E201B3E6306D7F8F378101005240F47C6FA5208F2602DB3C25C2009F547715A98412A020C100923070DE01DEA070DB3C8101005412015055F443029132E201B3E6145F04303026000EC858FA0201FA020172707F218EB0810100542270F47C6FA532218E9C3254411348705266DB3C5217BA05A45304BE927F36DE103847634550DE01B322B112E65F04012A0268810100D7018101005462A0F40E6FA131F2E0474930185618011112DB3C015619A18212540BE400BE8E845614DB3CDE11104870122A3104D68F2024C103F2E071DB3C6C21F9005360BD99343503A44413F823039130E25614DB3CDE5613C0078EB7F8237F8E2C56148307F47C6FA5208E1C02F40431D31F305230A18208278D00BC9A2011168307F45B301115DE9132E201B3E65B5614DB3CDE821047657424561401BA3531312B03B2810100546550F40E6FA1F2BCDB3CA08212540BE4005230A15210BC93306C14E0810100544666F45B30810100544655F45B3001A55124A182103B9ACA005250BE8F11705006DB3C6D80101023102670DB3C1023923434E24330303A3904E08F3024C201F2E06F24C202F82325A124A63CBCB1F2E070821047657424C8CB1F5220CB3FC9DB3C708018804010341023DB3CDE5613C0048E235616C0FF56162FBAB0F2E04982103B9ACA0001111901A120C200F2E04A51EEA00E1118DE5613C005925714E30D82104E73744B561301BA38392C2D04A85611C000F2E04A5616C0FF56162FBAB0F2E04BFA0021C200F2E04E29DB3C8212540BE400561A01A101A15220BBF2E04C51F1A120C100923070DE7F2FDB3C6D8010245970DB3C561858A15619A18212540BE400BE2E3A392F014E8E173005111605041115040311140302111302571157115F04E30D0F11100F10EF10DE10CD10BC32013E707F8E988101005230F47C6FA5208E8702DB3CA013A0029132E201B3E6303130011C8E841114DB3C925714E20D11130D31000AFA00FA00300114706D8010804072A0DB3C3904D63E5F050FC0FF51E6BA1EB0F2E04E08C000F2E04F25F2E05082103B9ACA001FBEF2E05609FA0020DB3C82103B9ACA005230A18218746A5288005240BEF2E0518212540BE40001111001A15230BBF2E052535FBEF2E0532EDB3C5260BEF2E0542D6EF2E05571DB3C31F9007033343536001CD3FF31D31FD31F31D3FF31D431D100848028F833206E985B8218178411B200E0D0D30731FA00D31FD30FD30FD30F31D30F31D30FD30F305053A8AB075033A8AB075023A8AB0759A8AB075220A9B41FA0B60800268022F83320D0D30701C012F289D31FD31F3058035CDB3CDB3C1110C8CB1F1CCB3F5006CF16C9801871041110041038DB3C0E11100E1F103E102D10BC107B50990743133738390022800FF833D0D31F31D31F31D31F31D70B1F011A71F833D0810100D7037F01DB3C3A0048226EB32091719170E203C8CB055006CF165004FA02CB6A039358CC019130E201C901FB00001C74C8CB0212CA07810100CF01C9D005B640B8'; options.wc = -1; options.code = Cell.oneFromBoc(INIT_POOL_CODE_HEX); super(provider, options); } createDataCell() { const data = this.options.data; const cell = new Cell(); cell.bits.writeUint(0, 8); // state cell.bits.writeUint(0, 16); // nominators_count cell.bits.writeCoins(0); // stake_amount_sent cell.bits.writeCoins(0); // validator_amount const configCell = new Cell(); configCell.bits.writeUint(data[4], 256); // validator_address configCell.bits.writeUint(data[5], 16); // validator_reward_share configCell.bits.writeUint(data[6], 16); // max_nominators_count configCell.bits.writeCoins(data[7]); // min_validator_stake configCell.bits.writeCoins(data[8]); // min_nominator_stake cell.refs[0] = configCell; cell.bits.writeBit(false); // nominators cell.bits.writeBit(false); // withdraw_requests cell.bits.writeUint(0, 32); // stake_at cell.bits.writeUint(0, 256); // saved_validator_set_hash cell.bits.writeUint(0, 8); // validator_set_changes_count cell.bits.writeUint(0, 32); // validator_set_change_time cell.bits.writeUint(0, 32); // stake_held_for cell.bits.writeBit(false); // config_proposal_votings return cell; } } const checkPool = async (poolAddress) => { try { const data = await tonweb.provider.call2(poolAddress, 'get_pool_data'); const info = await tonweb.provider.getAddressInfo(poolAddress); if (info.code !== POOL_CODE_BASE64) { return 'Unsupported nominator pool code. Please use https://github.com/ton-blockchain/nominator-pool'; } console.log(data); const poolContract = new PoolContract(null, {data: data}); const address = (await poolContract.getAddress()).toString(true, true, true, false); if (poolAddress !== address) { return 'Invalid init state of contract'; } return true; } catch (e) { console.error(e); return "cant invoke get-method `get_pool_data`"; } } const testPools = async () => { const pools = [ 'Ef8dgIOIRyCLU0NEvF8TD6Me3wrbrkS1z3Gpjk3ppd8m8-s_', 'Ef-WMmizoLk4CvqTKs-mDrGJwW4fiH5zVd4SaHih7PObxP_0', ]; for (let pool of pools) { if ((await checkPool(pool)) !== true) { throw new Error('AAA'); } } } testPools();