diff --git a/web3.js/src/connection.js b/web3.js/src/connection.js index 369de05002..63a542e133 100644 --- a/web3.js/src/connection.js +++ b/web3.js/src/connection.js @@ -18,7 +18,7 @@ export type TransactionSignature = string; */ export type TransactionId = string; -type RpcRequest = (methodName: string, args: Array) => any; +type RpcRequest = (methodName: string, args: Array) => any; function createRpcRequest(url): RpcRequest { const server = jayson( @@ -94,12 +94,12 @@ const RequestAirdropRpcResult = struct({ error: 'any?', result: 'boolean?', }); - -function sleep(duration = 0) { - return new Promise((accept) => { - setTimeout(accept, duration); - }); -} +const SendTokensRpcResult = struct({ + jsonrpc: struct.literal('2.0'), + id: 'string', + error: 'any?', + result: 'string?', +}); export class Connection { _rpcRequest: RpcRequest; @@ -182,11 +182,17 @@ export class Connection { // TODO: This is not the correct transaction payload `Transaction ${from.publicKey} ${to} ${amount}` ); - const signature = nacl.sign.detached(transaction, from.secretKey); - - console.log('Created signature of length', signature.length); - await sleep(500); // TODO: transmit transaction + signature - throw new Error(`Unable to send ${amount} tokens to ${to}`); + const signedTransaction = nacl.sign.detached(transaction, from.secretKey); + console.log(typeof signedTransaction); + console.log([...signedTransaction]); + const unsafeRes = await this._rpcRequest('sendTransaction', [[...signedTransaction]]); + const res = SendTokensRpcResult(unsafeRes); + if (res.error) { + throw new Error(res.error.message); + } + assert(typeof res.result !== 'undefined'); + assert(res.result); + return res.result; } } diff --git a/web3.js/test/connection.test.js b/web3.js/test/connection.test.js index f5ed3c62d8..da208d0028 100644 --- a/web3.js/test/connection.test.js +++ b/web3.js/test/connection.test.js @@ -14,7 +14,7 @@ test.skip('get balance', async () => { expect(balance).toBeGreaterThanOrEqual(0); }); -test.skip('throws on bad transaction', () => { +test.skip('throws on bad transaction confirmation', () => { const connection = new Connection(url); expect(connection.confirmTransaction('bad transaction signature')) @@ -55,4 +55,12 @@ test.skip('request airdrop', async () => { expect(balance).toBe(42); }); +test.skip('throws on bad transaction', () => { + const account = new Account(); + const connection = new Connection(url); + + expect(connection.sendTokens(account, account.publicKey, 123)) + .rejects.toThrow('Invalid request'); +}); +