UNPKG

@tatumio/tatum-v1

Version:

Tatum API client allows browsers and Node.js clients to interact with Tatum API.

321 lines 31.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const web3_1 = __importDefault(require("web3")); const erc721Provenance_abi_1 = __importDefault(require("../contracts/erc721Provenance/erc721Provenance_abi")); const model_1 = require("../model"); const polygon_1 = require("./polygon"); describe('MATIC transactions', () => { jest.setTimeout(99999); const broadcast = async (txData) => { const client = new web3_1.default('https://matic-mumbai.chainstacklabs.com/'); return await new Promise((resolve, reject) => { client.eth.sendSignedTransaction(txData) .once('transactionHash', txId => resolve({ txId })) .on('error', e => reject(new Error(`Unable to broadcast transaction due to ${e.message}.`))); }); }; describe('MATIC common transactions', () => { it('should test valid transaction MATIC data', async () => { const body = new model_1.TransferErc20(); body.fromPrivateKey = '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29'; body.amount = '0.0001'; body.currency = model_1.Currency.MATIC; body.to = '0x811DfbFF13ADFBC3Cf653dCc373C03616D3471c9'; const txData = await polygon_1.preparePolygonSignedTransaction(true, body, 'https://matic-mumbai.chainstacklabs.com/'); expect(txData).toContain('0x'); console.log(await broadcast(txData)); }); it('should test valid transaction MATIC store data', async () => { const body = new model_1.CreateRecord(); body.fromPrivateKey = '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29'; body.data = 'Hello hi'; body.chain = model_1.Currency.MATIC; const txData = await polygon_1.preparePolygonStoreDataTransaction(true, body, 'https://matic-mumbai.chainstacklabs.com/'); expect(txData).toContain('0x'); console.log(await broadcast(txData)); }); it('should test ethGetGasPriceInWei', async () => { const gasPrice = await polygon_1.polygonGetGasPriceInWei(); expect(gasPrice).not.toBeNull(); }); it('should test read smart contract method invocation', async () => { const result = await polygon_1.sendPolygonSmartContractReadMethodInvocationTransaction(true, { contractAddress: '0x0b9808fce74030c87aae334a30f6c8f6c66b090d', methodName: 'balanceOf', methodABI: { constant: true, inputs: [ { name: 'owner', type: 'address', }, ], name: 'balanceOf', outputs: [ { name: '', type: 'uint256', }, ], payable: false, stateMutability: 'view', type: 'function', }, params: ['0x9ac64cc6e4415144c455bd8e4837fea55603e5c3'], }, 'https://matic-mumbai.chainstacklabs.com/'); console.log(result); expect(result).not.toBeNull(); }); it('should test write smart contract method invocation', async () => { const result = await polygon_1.preparePolygonSmartContractWriteMethodInvocation(true, { fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', contractAddress: '0x0b9808fce74030c87aae334a30f6c8f6c66b090d', fee: { gasLimit: '100000', gasPrice: '3' }, methodName: 'transfer', methodABI: { constant: false, inputs: [ { name: 'to', type: 'address', }, { name: 'value', type: 'uint256', }, ], name: 'transfer', outputs: [ { name: '', type: 'bool', }, ], payable: false, stateMutability: 'nonpayable', type: 'function', }, params: ['0x8c76887d2e738371bd750362fb55887343472346', '1'], }, 'https://matic-mumbai.chainstacklabs.com/'); expect(result).not.toBeNull(); console.log(await broadcast(result)); }); }); describe('MATIC ERC20 transactions', () => { it('should test valid custom transaction ERC20 data', async () => { const body = new model_1.TransferErc20(); body.fromPrivateKey = '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29'; body.amount = '10'; body.contractAddress = '0x0b9808fce74030c87aae334a30f6c8f6c66b090d'; body.to = '0x811DfbFF13ADFBC3Cf653dCc373C03616D3471c9'; body.digits = 10; const txData = await polygon_1.preparePolygonTransferErc20SignedTransaction(true, body, 'https://matic-mumbai.chainstacklabs.com/'); expect(txData).toContain('0x'); console.log(await broadcast(txData)); }); it('should test valid custom deployment ERC20', async () => { const body = new model_1.DeployErc20(); body.fromPrivateKey = '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29'; body.symbol = 'SYMBOL'; body.name = 'Test_ERC20'; body.supply = '100'; body.address = '0x811DfbFF13ADFBC3Cf653dCc373C03616D3471c9'; body.digits = 10; const txData = await polygon_1.preparePolygonDeployErc20SignedTransaction(true, body, 'https://matic-mumbai.chainstacklabs.com/'); expect(txData).toContain('0x'); console.log(await broadcast(txData)); }); it('should test invalid custom deployment ERC20, missing supply', async () => { const body = new model_1.DeployErc20(); body.fromPrivateKey = '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29'; body.symbol = 'SYMBOL'; body.name = 'Test_ERC20'; body.address = '0x811DfbFF13ADFBC3Cf653dCc373C03616D3471c9'; body.digits = 10; try { await polygon_1.preparePolygonDeployErc20SignedTransaction(true, body, 'https://matic-mumbai.chainstacklabs.com/'); fail('Validation did not pass.'); } catch (e) { console.error(e); } }); }); describe('MATIC 721 transactions', () => { it('should test 721 deploy transaction', async () => { const deployBep721Token = await polygon_1.preparePolygonDeployErc721SignedTransaction(true, { symbol: '1oido3id3', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', chain: model_1.Currency.MATIC, name: '2123kd', }, 'https://matic-mumbai.chainstacklabs.com/'); expect(deployBep721Token).not.toBeNull(); console.log(await broadcast(deployBep721Token)); }); it('should test 721 mint transaction', async () => { try { const tokenId = new Date().getTime().toString(); const mintedToken = await polygon_1.preparePolygonMintErc721SignedTransaction(true, { to: '0x811dfbff13adfbc3cf653dcc373c03616d3471c9', tokenId, url: 'https://www.seznam.cz', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', chain: model_1.Currency.MATIC, contractAddress: '0x5d7d868ed584b04b922905a481f274206a42dd8a', }, 'https://matic-mumbai.chainstacklabs.com/'); console.log(tokenId); expect(mintedToken).not.toBeNull(); console.log(await broadcast(mintedToken)); } catch (e) { console.log(e); } }); it('should test 721 mint multiple transaction', async () => { const firstTokenId = new Date().getTime(); const secondTokenId = firstTokenId + 1; const mintedTokens = await polygon_1.preparePolygonMintMultipleErc721SignedTransaction(true, { to: ['0x811dfbff13adfbc3cf653dcc373c03616d3471c9', '0x811dfbff13adfbc3cf653dcc373c03616d3471c9'], tokenId: [firstTokenId.toString(), secondTokenId.toString()], url: ['https://www.seznam.cz', 'https://www.seznam.cz'], fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', chain: model_1.Currency.MATIC, contractAddress: '0x5d7d868ed584b04b922905a481f274206a42dd8a', }, 'https://matic-mumbai.chainstacklabs.com/'); expect(mintedTokens).not.toBeNull(); console.log(await broadcast(mintedTokens)); }); it('should test 721 burn transaction', async () => { const burnBep721Token = await polygon_1.preparePolygonBurnErc721SignedTransaction(true, { tokenId: '1626437687633', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', chain: model_1.Currency.MATIC, contractAddress: '0x5d7d868ed584b04b922905a481f274206a42dd8a', }, 'https://matic-mumbai.chainstacklabs.com/'); expect(burnBep721Token).not.toBeNull(); console.log(await broadcast(burnBep721Token)); }); it('should test 721 send transaction', async () => { const sendBep721Token = await polygon_1.preparePolygonTransferErc721SignedTransaction(true, { to: '0x811dfbff13adfbc3cf653dcc373c03616d3471c9', tokenId: '1626437745973', fromPrivateKey: '0x1a4344e55c562db08700dd32e52e62e7c40b1ef5e27c6ddd969de9891a899b29', chain: model_1.Currency.MATIC, contractAddress: '0x5d7d868ed584b04b922905a481f274206a42dd8a', }, 'https://matic-mumbai.chainstacklabs.com/'); expect(sendBep721Token).not.toBeNull(); console.log(await broadcast(sendBep721Token)); }); }); describe('MATIC 721 provenance transactions', () => { it('should test 721 deploy transaction', async () => { const deployBep721Token = await polygon_1.preparePolygonDeployErc721SignedTransaction(true, { symbol: '1oido3id3', fromPrivateKey: '0xf17abcb517d759efee24bc4859183c7219c588540754318baebb3f9c31449564', chain: model_1.Currency.MATIC, provenance: true, name: '2123kd', }, 'https://matic-mumbai.chainstacklabs.com/'); expect(deployBep721Token).not.toBeNull(); console.log(await broadcast(deployBep721Token)); }); it('should test 721 provenance mint transaction', async () => { try { const tokenId = new Date().getTime().toString(); const mintedToken = await polygon_1.preparePolygonMintErc721ProvenanceSignedTransaction(true, { to: '0x75Bd6dFA13C0086b9C8C4b510b1F758c720B79BF', tokenId, url: 'https://www.seznam.cz', fromPrivateKey: '0xf17abcb517d759efee24bc4859183c7219c588540754318baebb3f9c31449564', chain: model_1.Currency.MATIC, contractAddress: '0x8D2A0dd3855ECA8591756a606DA9829f703cA26B', }, 'https://matic-mumbai.chainstacklabs.com/'); console.log(tokenId); expect(mintedToken).not.toBeNull(); console.log(await broadcast(mintedToken)); } catch (e) { console.log(e); } }); it('should test 721 provenance mint with cashback transaction', async () => { try { const mintedToken = await polygon_1.preparePolygonMintErc721ProvenanceSignedTransaction(true, { to: '0x80D8BAc9a6901698b3749Fe336bBd1385C1f98f2', tokenId: '12', url: 'https://www.seznam.cz', fromPrivateKey: '0x37b091fc4ce46a56da643f021254612551dbe0944679a6e09cb5724d3085c9ab', authorAddresses: ['0x75Bd6dFA13C0086b9C8C4b510b1F758c720B79BF'], cashbackValues: ['2'], fixedValues: ['0.01'], chain: model_1.Currency.MATIC, contractAddress: '0x44ef7a380c34E76a39Cb00410956dE2aeeaf3B1B', }, 'https://matic-mumbai.chainstacklabs.com/'); expect(mintedToken).not.toBeNull(); console.log(await broadcast(mintedToken)); } catch (e) { console.log(e); } }); it('should test 721 mint multiple with cashback transaction', async () => { const mintedTokens = await polygon_1.preparePolygonMintMultipleErc721ProvenanceSignedTransaction(true, { to: ['0x75Bd6dFA13C0086b9C8C4b510b1F758c720B79BF', '0x75Bd6dFA13C0086b9C8C4b510b1F758c720B79BF'], tokenId: ['5', '6'], url: ['https://www.seznam.cz', 'https://www.seznam.cz'], authorAddresses: [['0xD25031B1aB4D82e5fDFb700234b2a22e272232Be'], ['0xD25031B1aB4D82e5fDFb700234b2a22e272232Be']], cashbackValues: [['1'], ['1']], fixedValues: [['1'], ['1']], fromPrivateKey: '0xf17abcb517d759efee24bc4859183c7219c588540754318baebb3f9c31449564', chain: model_1.Currency.MATIC, contractAddress: '0xe54a147b6ebe25bda0eec07e8a0051c1b9d08338', }, 'https://matic-mumbai.chainstacklabs.com/'); expect(mintedTokens).not.toBeNull(); console.log(await broadcast(mintedTokens)); }); it('should test 721 send transaction', async () => { const senderc721Token = await polygon_1.preparePolygonTransferErc721SignedTransaction(true, { to: '0xD25031B1aB4D82e5fDFb700234b2a22e272232Be', tokenId: '12', fromPrivateKey: '0x37b091fc4ce46a56da643f021254612551dbe0944679a6e09cb5724d3085c9ab', chain: model_1.Currency.MATIC, provenance: true, provenanceData: 'testMatic', tokenPrice: '1.5', value: '2', fee: { gasLimit: '1200000', gasPrice: '3', }, contractAddress: '0x44ef7a380c34E76a39Cb00410956dE2aeeaf3B1B', }, 'https://matic-mumbai.chainstacklabs.com/'); console.log(senderc721Token); expect(senderc721Token).not.toBeNull(); console.log(await broadcast(senderc721Token)); }); it('should test valid transfer data 721 transaction', async () => { const body = new model_1.SmartContractReadMethodInvocation(); body.contractAddress = '0xe54a147b6ebe25bda0eec07e8a0051c1b9d08338'; body.params = ['1634501273645']; body.methodName = 'getTokenData'; body.methodABI = erc721Provenance_abi_1.default.find((a) => a.name === 'getTokenData'); const response = await polygon_1.sendPolygonSmartContractReadMethodInvocationTransaction(true, body, 'https://matic-mumbai.chainstacklabs.com/'); // @ts-ignore console.log(JSON.stringify(response)); }); it('should test 721 burn transaction', async () => { const burnBep721Token = await polygon_1.preparePolygonBurnErc721SignedTransaction(true, { tokenId: '5', fromPrivateKey: '0xf17abcb517d759efee24bc4859183c7219c588540754318baebb3f9c31449564', chain: model_1.Currency.MATIC, contractAddress: '0xe54a147b6ebe25bda0eec07e8a0051c1b9d08338', }, 'https://matic-mumbai.chainstacklabs.com/'); expect(burnBep721Token).not.toBeNull(); // console.log(await broadcast(burnBep721Token)) }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9seWdvbi5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL3BvbHlnb24uc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdEQUF3QjtBQUN4Qiw4R0FBc0Y7QUFDdEYsb0NBQWlIO0FBQ2pILHVDQWVtQjtBQUVuQixRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdEIsTUFBTSxTQUFTLEdBQUcsS0FBSyxFQUFFLE1BQWMsRUFBRSxFQUFFO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUE7UUFDbkUsT0FBTyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNDLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDO2lCQUNyQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2lCQUNsRCxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEcsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUE7SUFFRCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN4RCxNQUFNLElBQUksR0FBRyxJQUFJLHFCQUFhLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLG9FQUFvRSxDQUFDO1lBQzNGLElBQUksQ0FBQyxNQUFNLEdBQUcs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