Installation and usage of the platform
Examples of JavaScript SDK usage¶
Token transfer (4)¶
const { create: createApiInstance, MAINNET_CONFIG } = require('..');
const nodeFetch = require('node-fetch');
const nodeAddress = 'https://hoover.welocal.dev/node-0';
const seedPhrase = 'examples seed phrase';
const fetch = (url, options = {}) => {
const headers = options.headers || {}
return nodeFetch(url, { ...options, headers: {...headers, 'x-api-key': 'vostok'} });
}
(async () => {
const { chainId, minimumFee, gostCrypto } = await (await fetch(`${nodeAddress}/node/config`)).json();
const wavesApiConfig = {
...MAINNET_CONFIG,
nodeAddress,
crypto: gostCrypto ? 'gost' : 'waves',
networkByte: chainId.charCodeAt(0),
};
const Waves = createApiInstance({
initialConfiguration: wavesApiConfig,
fetchInstance: fetch
});
// Create Seed object from phrase
const seed = Waves.Seed.fromExistingPhrase(seedPhrase);
// see docs: https://docs.wavesenterprise.com/en/latest/how-the-platform-works/data-structures/transactions-structure.html#transfertransaction
const txBody = {
recipient: seed.address,
assetId: '',
amount: 10000,
fee: minimumFee[4],
attachment: Waves.tools.base58.encode('Examples transfer attachment'),
timestamp: Date.now()
}
const tx = Waves.API.Transactions.Transfer.V3(txBody);
try {
const result = await tx.broadcast(seed.keyPair);
console.log('Broadcast transfer result: ', result)
} catch (err) {
console.log('Broadcast error:', err)
}
})();
Creation of a confidential data group (112)¶
const { create: createApiInstance, MAINNET_CONFIG } = require('..');
const nodeFetch = require('node-fetch');
const nodeAddress = 'https://hoover.welocal.dev/node-0';
const seedPhrase = 'examples seed phrase';
const fetch = (url, options = {}) => {
const headers = options.headers || {}
return nodeFetch(url, { ...options, headers: {...headers, 'x-api-key': 'vostok'} });
}
(async () => {
const { chainId, minimumFee, gostCrypto } = await (await fetch(`${nodeAddress}/node/config`)).json();
const wavesApiConfig = {
...MAINNET_CONFIG,
nodeAddress,
crypto: gostCrypto ? 'gost' : 'waves',
networkByte: chainId.charCodeAt(0),
};
const Waves = createApiInstance({
initialConfiguration: wavesApiConfig,
fetchInstance: fetch
});
// Create Seed object from phrase
const seed = Waves.Seed.fromExistingPhrase(seedPhrase);
// Transaction data
// https://docs.wavesenterprise.com/en/latest/how-the-platform-works/data-structures/transactions-structure.html#createpolicytransaction
const txBody = {
sender: seed.address,
policyName: 'Example policy',
description: 'Description for example policy',
owners: [seed.address],
recipients: [],
fee: minimumFee[112],
timestamp: Date.now(),
}
const tx = Waves.API.Transactions.CreatePolicy.V3(txBody);
try {
const result = await tx.broadcast(seed.keyPair);
console.log('Broadcast PolicyCreate result: ', result)
} catch (err) {
console.log('Broadcast error:', err)
}
})();
Permission adding and removing (102)¶
const { create: createApiInstance, MAINNET_CONFIG } = require('..');
const nodeFetch = require('node-fetch');
const nodeAddress = 'https://hoover.welocal.dev/node-0';
const seedPhrase = 'examples seed phrase';
const fetch = (url, options = {}) => {
const headers = options.headers || {}
return nodeFetch(url, { ...options, headers: {...headers, 'x-api-key': 'vostok'} });
}
(async () => {
const { chainId, minimumFee, gostCrypto } = await (await fetch(`${nodeAddress}/node/config`)).json();
const wavesApiConfig = {
...MAINNET_CONFIG,
nodeAddress,
crypto: gostCrypto ? 'gost' : 'waves',
networkByte: chainId.charCodeAt(0),
};
const Waves = createApiInstance({
initialConfiguration: wavesApiConfig,
fetchInstance: fetch
});
// Create Seed object from phrase
const seed = Waves.Seed.fromExistingPhrase(seedPhrase);
const targetSeed = Waves.Seed.create(15);
// https://docs.wavesenterprise.com/en/latest/how-the-platform-works/data-structures/transactions-structure.html#permittransaction
const txBody = {
target: targetSeed.address,
opType: 'add',
role: 'issuer',
fee: minimumFee[102],
timestamp: Date.now(),
}
const permTx = Waves.API.Transactions.Permit.V2(txBody);
try {
const result = await permTx.broadcast(seed.keyPair);
console.log('Broadcast ADD PERMIT: ', result)
const waitTimeout = 30
console.log(`Wait ${waitTimeout} seconds while tx is mining...`)
await new Promise(resolve => {
setTimeout(resolve, waitTimeout * 1000)
})
const removePermitBody = {
...txBody,
opType: 'remove',
timestamp: Date.now()
}
const removePermitTx = Waves.API.Transactions.Permit.V2(removePermitBody);
const removePermitResult = await removePermitTx.broadcast(seed.keyPair);
console.log('Broadcast REMOVE PERMIT: ', removePermitResult)
} catch (err) {
console.log('Broadcast error:', err)
}
})();
Smart contract creation (103)¶
const { create: createApiInstance, MAINNET_CONFIG } = require('..');
const nodeFetch = require('node-fetch');
const nodeAddress = 'https://hoover.welocal.dev/node-0';
const seedPhrase = 'examples seed phrase';
const fetch = (url, options = {}) => {
const headers = options.headers || {}
return nodeFetch(url, { ...options, headers: {...headers, 'x-api-key': 'vostok'} });
}
(async () => {
const { chainId, minimumFee, gostCrypto } = await (await fetch(`${nodeAddress}/node/config`)).json();
const wavesApiConfig = {
...MAINNET_CONFIG,
nodeAddress,
crypto: gostCrypto ? 'gost' : 'waves',
networkByte: chainId.charCodeAt(0),
};
const Waves = createApiInstance({
initialConfiguration: wavesApiConfig,
fetchInstance: fetch
});
// Create Seed object from phrase
const seed = Waves.Seed.fromExistingPhrase(seedPhrase);
const timestamp = Date.now();
//body description: https://docs.wavesenterprise.com/en/latest/how-the-platform-works/data-structures/transactions-structure.html#createcontracttransaction
const txBody = {
senderPublicKey: seed.keyPair.publicKey,
image: 'vostok-sc/grpc-contract-example:2.1',
imageHash: '9fddd69022f6a47f39d692dfb19cf2bdb793d8af7b28b3d03e4d5d81f0aa9058',
contractName: 'Sample GRPC contract',
timestamp,
params: [],
fee: minimumFee[103]
};
const tx = Waves.API.Transactions.CreateContract.V3(txBody)
try {
const result = await tx.broadcast(seed.keyPair);
console.log('Broadcast docker create result: ', result)
} catch (err) {
console.log('Broadcast error:', err)
}
})();
Smart contract call (104)¶
const { create: createApiInstance, MAINNET_CONFIG } = require('..');
const nodeFetch = require('node-fetch');
const nodeAddress = 'https://hoover.welocal.dev/node-0';
const seedPhrase = 'examples seed phrase';
const fetch = (url, options = {}) => {
const headers = options.headers || {}
return nodeFetch(url, { ...options, headers: {...headers, 'x-api-key': 'vostok'} });
}
(async () => {
const { chainId, minimumFee, gostCrypto } = await (await fetch(`${nodeAddress}/node/config`)).json();
const wavesApiConfig = {
...MAINNET_CONFIG,
nodeAddress,
crypto: gostCrypto ? 'gost' : 'waves',
networkByte: chainId.charCodeAt(0),
};
const Waves = createApiInstance({
initialConfiguration: wavesApiConfig,
fetchInstance: fetch
});
// Create Seed object from phrase
const seed = Waves.Seed.fromExistingPhrase(seedPhrase);
const timestamp = Date.now()
//body description: https://docs.wavesenterprise.com/en/latest/how-the-platform-works/data-structures/transactions-structure.html#callcontracttransaction
const txBody = {
authorPublicKey: seed.keyPair.publicKey,
contractId: '4pSJoWsaYvT8iCSAxUYdc7LwznFexnBGPRoUJX7Lw3sh', // Predefined contract
contractVersion: 1,
timestamp,
params: [],
fee: minimumFee[104]
};
const tx = Waves.API.Transactions.CallContract.V4(txBody)
try {
const result = await tx.broadcast(seed.keyPair);
console.log('Broadcast docker call result: ', result)
} catch (err) {
console.log('Broadcast error:', err)
}
})();
Atomic transaction (120)¶
const { create: createApiInstance, MAINNET_CONFIG } = require('..');
const nodeFetch = require('node-fetch');
const nodeAddress = 'https://hoover.welocal.dev/node-0';
const seedPhrase = 'examples seed phrase';
const fetch = (url, options = {}) => {
const headers = options.headers || {}
return nodeFetch(url, { ...options, headers: {...headers, 'x-api-key': 'vostok'} });
}
(async () => {
const { chainId, minimumFee, gostCrypto } = await (await fetch(`${nodeAddress}/node/config`)).json();
const wavesApiConfig = {
...MAINNET_CONFIG,
nodeAddress,
crypto: gostCrypto ? 'gost' : 'waves',
networkByte: chainId.charCodeAt(0),
};
const Waves = createApiInstance({
initialConfiguration: wavesApiConfig,
fetchInstance: fetch
});
// Create Seed object from phrase
const seed = Waves.Seed.fromExistingPhrase(seedPhrase);
const transfer1Body = {
recipient: seed.address,
amount: 10000,
fee: minimumFee[4],
attachment: Waves.tools.base58.encode('Its beautiful!'),
timestamp: Date.now(),
atomicBadge: {
trustedSender: seed.address
}
}
const transfer1 = Waves.API.Transactions.Transfer.V3(transfer1Body);
const transfer2Body = {
recipient: seed.address,
amount: 100000,
fee: minimumFee[4],
attachment: Waves.tools.base58.encode('Its beautiful!'),
timestamp: Date.now(),
atomicBadge: {
trustedSender: seed.address
}
}
const transfer2 = Waves.API.Transactions.Transfer.V3(transfer2Body);
const dockerCall1Body = {
authorPublicKey: seed.keyPair.publicKey,
contractId: '4pSJoWsaYvT8iCSAxUYdc7LwznFexnBGPRoUJX7Lw3sh', // Predefined contract
contractVersion: 1,
timestamp: Date.now(),
params: [],
fee: minimumFee[104],
atomicBadge: {
trustedSender: seed.address
}
}
const dockerCall1 = Waves.API.Transactions.CallContract.V4(dockerCall1Body);
const dockerCall2Body = {
authorPublicKey: seed.keyPair.publicKey,
contractId: '4pSJoWsaYvT8iCSAxUYdc7LwznFexnBGPRoUJX7Lw3sh',
contractVersion: 1,
timestamp: Date.now() + 1,
params: [],
fee: minimumFee[104],
atomicBadge: {
trustedSender: seed.address
}
}
const dockerCall2 = Waves.API.Transactions.CallContract.V4(dockerCall1Body);
const policyDataText = `Some random text ${Date.now()}`
const uint8array = Waves.tools.convert.stringToByteArray(policyDataText);
const { base64Text, hash } = Waves.tools.encodePolicyData(uint8array)
const policyDataHashBody = {
"sender": "3NkZd8Xd4KsuPiNVsuphRNCZE3SqJycqv8d",
"policyId": "9QUUuQ5XetCe2wEyrSX95NEVzPw2bscfcFfAzVZL5ZJN",
"type": "file",
"data": base64Text,
"hash": hash,
"info": {
"filename":"test-send1.txt",
"size":1,
"timestamp": Date.now(),
"author":"[email protected]",
"comment":""
},
"fee": 5000000,
"password": "sfgKYBFCF@#$fsdf()*%",
"timestamp": Date.now(),
"version": 3,
"apiKey": 'vostok',
}
const policyDataHashTxBody = {
...policyDataHashBody,
atomicBadge: {
trustedSender: seed.address
}
}
const policyDataHashTx = Waves.API.Transactions.PolicyDataHash.V3(policyDataHashTxBody);
try {
const transactions = [transfer1, transfer2, policyDataHashTx]
const broadcast = await Waves.API.Transactions.broadcastAtomic(
Waves.API.Transactions.Atomic.V1({transactions}),
seed.keyPair
);
console.log('Atomic broadcast successful, tx id:', broadcast.id)
} catch (err) {
console.log('Create atomic error:', err)
}
})();
Token issue/burning (3 / 6)¶
const { create: createApiInstance, MAINNET_CONFIG } = require('..');
const nodeFetch = require('node-fetch');
const nodeAddress = 'https://hoover.welocal.dev/node-0';
const seedPhrase = 'examples seed phrase';
const fetch = (url, options = {}) => {
const headers = options.headers || {}
return nodeFetch(url, { ...options, headers: {...headers, 'x-api-key': 'vostok'} });
}
(async () => {
const { chainId, minimumFee, gostCrypto } = await (await fetch(`${nodeAddress}/node/config`)).json();
const wavesApiConfig = {
...MAINNET_CONFIG,
nodeAddress,
crypto: gostCrypto ? 'gost' : 'waves',
networkByte: chainId.charCodeAt(0),
};
const Waves = createApiInstance({
initialConfiguration: wavesApiConfig,
fetchInstance: fetch
});
// Create Seed object from phrase
const seed = Waves.Seed.fromExistingPhrase(seedPhrase);
const quantity = 1000000
//https://docs.wavesenterprise.com/en/latest/how-the-platform-works/data-structures/transactions-structure.html#issuetransaction
const issueBody = {
name: 'Sample token',
description: 'The best token ever made',
quantity,
decimals: 8,
reissuable: false,
chainId: Waves.config.getNetworkByte(),
fee: minimumFee[3],
timestamp: Date.now(),
script: null
}
const issueTx = Waves.API.Transactions.Issue.V2(issueBody)
try {
const result = await issueTx.broadcast(seed.keyPair);
console.log('Broadcast ISSUE result: ', result)
const waitTimeout = 30
console.log(`Wait ${waitTimeout} seconds while tx is mining...`)
await new Promise(resolve => {
setTimeout(resolve, waitTimeout * 1000)
})
const burnBody = {
assetId: result.assetId,
amount: quantity,
fee: minimumFee[6],
chainId: Waves.config.getNetworkByte(),
timestamp: Date.now()
}
const burnTx = Waves.API.Transactions.Burn.V2(burnBody)
const burnResult = await burnTx.broadcast(seed.keyPair);
console.log('Broadcast BURN result: ', burnResult)
} catch (err) {
console.log('Broadcast error:', err)
}
})();