ontology-ts-sdk
Version:
Comprehensive TypeScript library for the Ontology blockchain.
284 lines (264 loc) • 13.2 kB
text/typescript
import { RestClient } from '../../src';
import BigInt from '../../src/common/bigInt';
import { PrivateKey } from '../../src/crypto';
import {
makeDeployCodeTransaction, makeWasmVmInvokeTransaction, signTransaction
} from '../../src/transaction/transactionBuilder';
import { hexstr2str } from '../../src/utils';
import { Account } from './../../src/account';
import { Result } from './../../src/claim/attestNotifyEvent';
import { Status } from './../../src/claim/claim';
import { I128, I128FromBigInt, I128FromInt, maxBigU128, maxI128, minI128 } from './../../src/common/int128';
import { Address } from './../../src/crypto/address';
import { WebsocketClient } from './../../src/network/websocket/websocketClient';
import { Parameter, ParameterType } from './../../src/smartcontract/abi/parameter';
import { VmType } from './../../src/transaction/payload/deployCode';
import { reverseHex, StringReader } from './../../src/utils';
// tslint:disable-next-line:no-var-requires
const fs = require('fs');
describe('test deploy contract', () => {
const privateKey = new PrivateKey('7c47df9664e7db85c1308c080f398400cb24283f5d922e76b478b5429e821b93');
const account = Account.create(privateKey, '123456', 'test');
// tslint:disable:no-console
console.log(account.address.toBase58());
const contractCode = fs.readFileSync(__dirname + '/helloworld.wasm').toString('hex');
const restClient = new RestClient();
const wsClient = new WebsocketClient();
test('deployWasmContract', async () => {
// console.log(code);
// tslint:disable-next-line:max-line-length
const tx = makeDeployCodeTransaction(contractCode, 'wasmContract', '1.0', 'alice', 'testmail', 'desc', VmType.WASMVM_TYPE, '500', '30000000');
tx.payer = account.address;
signTransaction(tx, privateKey);
const result = await restClient.sendRawTransaction(tx.serialize());
console.log(result);
expect(result.Error).toEqual(0);
});
test('get_contract', async () => {
const contract = Address.fromVmCode(contractCode);
const codeHash = contract.toHexString();
// tslint:disable:no-console
console.log('contract address: ' + contract.serialize());
console.log('codeHash: ' + codeHash);
const rest = new RestClient('http://13.57.184.209:20334');
const result = await restClient.getContractJson('d26bd5624d5fd809fdccd865cffaac766c61b6a0');
console.log(result);
expect(result.Result).toBeTruthy();
}, 10000);
test('invokeAdd', async () => {
const contractAddress = new Address('5daf0ec53b21abfab6459c7ba7f760c376e18ebf');
const params = [
// new Parameter('param1', ParameterType.Long, '-1'),
// new Parameter('param2', ParameterType.Long, '2')
new Parameter('param1', ParameterType.Integer, -1),
new Parameter('param2', ParameterType.Integer, 2)
];
const tx = makeWasmVmInvokeTransaction('add', params, contractAddress, '500', '20000', account.address);
console.log(tx.payload.serialize());
signTransaction(tx, privateKey);
const result = await wsClient.sendRawTransaction(tx.serialize(), true);
console.log(result);
expect(result.Error).toEqual(0);
}, 10000);
test('invokeNotify', async () => {
const contractAddress = new Address('5daf0ec53b21abfab6459c7ba7f760c376e18ebf');
const tx = makeWasmVmInvokeTransaction('notify', [], contractAddress, '500', '20000', account.address);
console.log(tx.payload.serialize());
signTransaction(tx, privateKey);
const result = await wsClient.sendRawTransaction(tx.serialize(), true);
console.log(JSON.stringify(result));
console.log(hexstr2str(result.Result));
expect(result.Error).toEqual(0);
}, 10000);
test('invokePre', async () => {
const methods = ['timestamp', 'block_height', 'self_address', 'caller_address', 'entry_address',
'current_txhash', 'current_blockhash'];
const contractAddress = new Address('5daf0ec53b21abfab6459c7ba7f760c376e18ebf');
for (const method of methods) {
const params = [];
const tx = makeWasmVmInvokeTransaction(method, params, contractAddress, '500', '20000', account.address);
signTransaction(tx, privateKey);
const result = await restClient.sendRawTransaction(tx.serialize(), true);
console.log(result);
expect(result.Error).toEqual(0);
}
}, 10000);
test('invokeStorageWrite', async () => {
const contractAddress = new Address('5daf0ec53b21abfab6459c7ba7f760c376e18ebf');
const params = [
new Parameter('param1', ParameterType.String, 'abc'),
new Parameter('param2', ParameterType.String, '123')
];
const tx = makeWasmVmInvokeTransaction('storage_write', params, contractAddress,
'500', '20000', account.address);
signTransaction(tx, privateKey);
const result = await wsClient.sendRawTransaction(tx.serialize(), false);
console.log(result);
expect(result.Error).toEqual(0);
}, 10000);
test('invokeStorageRead', async () => {
const contractAddress = new Address('5daf0ec53b21abfab6459c7ba7f760c376e18ebf');
const params = [
new Parameter('param1', ParameterType.String, 'abc')
];
const tx = makeWasmVmInvokeTransaction('storage_read', params, contractAddress,
'500', '20000', account.address);
signTransaction(tx, privateKey);
const result = await restClient.sendRawTransaction(tx.serialize(), true);
console.log(result);
console.log(hexstr2str(result.Result.Result));
expect(result.Error).toEqual(0);
}, 10000);
test('invokeStorageDelete', async () => {
const contractAddress = new Address('5daf0ec53b21abfab6459c7ba7f760c376e18ebf');
const params = [
new Parameter('param1', ParameterType.String, 'abc')
];
const tx = makeWasmVmInvokeTransaction('storage_delete', params, contractAddress,
'500', '20000', account.address);
signTransaction(tx, privateKey);
const result = await wsClient.sendRawTransaction(tx.serialize(), false);
console.log(result);
expect(result.Error).toEqual(0);
}, 10000);
test('balanceOf', async () => {
const contractAddress = new Address(reverseHex('44d451cb5ef516eac96c5a1bd32b51f1385e4931'));
const params = [
// tslint:disable-next-line:max-line-length
// wasm 合约Address类型的值不能传对应ByteArray的值
new Parameter('param1', ParameterType.Address, new Address('AUr5QUfeBADq6BMY6Tp5yuMsUNGpsD7nLZ')
];
// 没有decimal 方法?
const tx = makeWasmVmInvokeTransaction('decimal', params, contractAddress,
'500', '20000', account.address);
console.log(tx.payload.serialize());
signTransaction(tx, privateKey);
const wsClient = new WebsocketClient('ws://13.57.184.209:20335');
const result = await wsClient.sendRawTransaction(tx.serialize(), true);
console.log(result);
console.log(hexstr2str(result.Result.Result));
expect(result.Error).toEqual(0);
}, 10000);
test('transfer', async () => {
const contractAddress = new Address(reverseHex('44d451cb5ef516eac96c5a1bd32b51f1385e4931'));
const params = [
new Parameter('param1', ParameterType.Address, new Address('AJkkLbouowk6teTaxz1F2DYKfJh24PVk3r')),
new Parameter('param1', ParameterType.Address, new Address('AUr5QUfeBADq6BMY6Tp5yuMsUNGpsD7nLZ')),
new Parameter('param1', ParameterType.Long, '10')
];
const tx = makeWasmVmInvokeTransaction('transfer', params, contractAddress,
'500', '300000', account.address);
console.log(tx.payload.serialize());
signTransaction(tx, privateKey);
const wsClient = new WebsocketClient('ws://13.57.184.209:20335');
const result = await wsClient.sendRawTransaction(tx.serialize(), false);
console.log(JSON.stringify(result));
if (result.Result && result.Result.Result) {
console.log(hexstr2str(result.Result.Result));
}
expect(result.Error).toEqual(0);
}, 10000);
test('smartCodeEvent', async () => {
const rest = new RestClient('http://13.57.184.209:20334');
const res = await rest.getSmartCodeEvent('377617131b99c4472e174e53b939234df278a23e705cfafacce5702dcd0f2c4e');
console.log(JSON.stringify(res));
expect(res.Result).toBeTruthy();
});
test('i128', async () => {
const i128 = I128FromBigInt('9007199254740993');
console.log(i128.serialize());
expect(i128.serialize()).toEqual('01000000000020000000000000000000');
});
test('max128', () => {
console.log(maxI128.toString(16));
});
test('transformNumber', () => {
const data = {
'minI128': '00000000000000000000000000000080',
'maxI128': 'ffffffffffffffffffffffffffffff7f',
'-2': 'feffffffffffffffffffffffffffffff',
'-1': 'ffffffffffffffffffffffffffffffff',
'0': '00000000000000000000000000000000',
'1': '01000000000000000000000000000000',
'2': '02000000000000000000000000000000'
};
const bmin = minI128.toString();
const bminI128 = I128FromBigInt(bmin).serialize();
expect(bminI128).toEqual(data.minI128);
const bmax = maxI128.toString();
const bmaxI128 = I128FromBigInt(bmax).serialize();
expect(bmaxI128).toEqual(data.maxI128);
expect(I128FromInt(-2).serialize()).toEqual(data['-2']);
expect(I128FromInt(-1).serialize()).toEqual(data['-1']);
expect(I128FromInt(0).serialize()).toEqual(data['0']);
expect(I128FromInt(1).serialize()).toEqual(data['1']);
expect(I128FromInt(2).serialize()).toEqual(data['2']);
console.log(I128FromInt(-2).serialize());
console.log(I128FromInt(-1).serialize());
console.log(I128FromInt(0).serialize());
console.log(I128FromInt(1).serialize());
console.log(I128FromInt(2).serialize());
});
test('vote', async () => {
const gasPrice = '500';
const gasLimit = '20000';
const contract = new Address(reverseHex('6c977ca7036c991fa430ba3b34643e146501218c'));
const rest = new RestClient('http://172.168.3.165:20334');
// 没有decimal 方法?
const tx = makeWasmVmInvokeTransaction('listTopics', [], contract, '500', '20000');
// const wsClient = new WebsocketClient('ws://13.57.184.209:20335');
const result = await rest.sendRawTransaction(tx.serialize(), true);
console.log(result);
const sr = new StringReader(result.Result.Result);
console.log(sr.readVarUint());
const hash = sr.read(32);
console.log(hash);
const tx2 = makeWasmVmInvokeTransaction('getTopicInfo', [
new Parameter('', ParameterType.H256, hash)], contract, gasPrice, gasLimit);
const result2 = await rest.sendRawTransaction(tx2.serialize(), true);
console.log(result2);
console.log(formatVoteInfo(result2.Result.Result));
expect(result.Error).toEqual(0);
function formatVoteInfo(data) {
const sr = new StringReader(data);
const hasValue = sr.readVarUint() > 0;
if (hasValue) {
const admin = new Address(sr.read(20)).toBase58();
// tslint:disable:variable-name
const topic_title_length = sr.readVarUint();
const topic_title = hexstr2str(sr.read(topic_title_length));
const topic_detail_length = sr.readVarUint();
const topic_detail = hexstr2str(sr.read(topic_detail_length));
const voters_length = sr.readVarUint();
const voters = [];
for (let i = 0; i < voters_length; i++) {
const voter_addr = new Address(sr.read(20)).toBase58();
const weight = sr.readUint128();
voters.push({
voter: voter_addr,
weight
});
}
const start_time = sr.readUint64();
const end_time = sr.readUint64();
const approve = sr.readUint64();
const reject = sr.readUint64();
const status = sr.readUint8();
const hash = sr.readH256();
return {
admin,
topic_title,
topic_detail,
voters,
start_time,
end_time,
approve,
reject,
status,
hash
};
}
return null;
}
}, 10000);
});