From 5fe11dd798295836d14feaca314344f366209ee2 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Mon, 22 Mar 2021 11:33:24 +0200 Subject: [PATCH 1/5] test: withdraw amount types --- src/dataunion/DataUnion.ts | 9 +++++++-- test/integration/dataunion/signature.test.ts | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/dataunion/DataUnion.ts b/src/dataunion/DataUnion.ts index 9aaf39495..cb178fdf5 100644 --- a/src/dataunion/DataUnion.ts +++ b/src/dataunion/DataUnion.ts @@ -2,7 +2,7 @@ import { getAddress } from '@ethersproject/address' import { BigNumber } from '@ethersproject/bignumber' import { arrayify, hexZeroPad } from '@ethersproject/bytes' import { Contract } from '@ethersproject/contracts' -import { TransactionReceipt, TransactionResponse } from '@ethersproject/providers' +import { JsonRpcSigner, TransactionReceipt, TransactionResponse } from '@ethersproject/providers' import debug from 'debug' import { Contracts } from './Contracts' import { StreamrClient } from '../StreamrClient' @@ -229,8 +229,13 @@ export class DataUnion { const memberData = await duSidechain.memberData(address) if (memberData[0] === '0') { throw new Error(`${address} is not a member in Data Union (sidechain address ${duSidechain.address})`) } const withdrawn = memberData[3] + return this._createWithdrawSignature(amountTokenWei, to, withdrawn, signer) + } + + /** @internal */ + async _createWithdrawSignature(amountTokenWei: BigNumber|number|string, to: EthereumAddress, withdrawn: BigNumber, signer: JsonRpcSigner) { // @ts-expect-error - const message = to + hexZeroPad(amountTokenWei, 32).slice(2) + duSidechain.address.slice(2) + hexZeroPad(withdrawn, 32).slice(2) + const message = to + hexZeroPad(amountTokenWei, 32).slice(2) + this.getSidechainAddress().slice(2) + hexZeroPad(withdrawn, 32).slice(2) const signature = await signer.signMessage(arrayify(message)) return signature } diff --git a/test/integration/dataunion/signature.test.ts b/test/integration/dataunion/signature.test.ts index 657ca60f5..a7520280e 100644 --- a/test/integration/dataunion/signature.test.ts +++ b/test/integration/dataunion/signature.test.ts @@ -1,4 +1,4 @@ -import { Contract, providers, Wallet } from 'ethers' +import { BigNumber, Contract, providers, Wallet } from 'ethers' import { parseEther } from 'ethers/lib/utils' import debug from 'debug' @@ -74,4 +74,20 @@ describe('DataUnion signature', () => { expect(isValid2).toBe(true) expect(isValid3).toBe(true) }, 100000) + + it('create signatute', async () => { + const client = new StreamrClient({ + auth: { + privateKey: '0x1111111111111111111111111111111111111111111111111111111111111111' + } + }) + const dataUnion = client.getDataUnion('0x2222222222222222222222222222222222222222') + const to = '0x3333333333333333333333333333333333333333' + const withdrawn = BigNumber.from('4000000000000000') + // 0.005 tokens + for (const amount of [5000000000000000, '5000000000000000', BigNumber.from('5000000000000000')]) { + const signature = await dataUnion._createWithdrawSignature(amount, to, withdrawn, client.ethereum.getSigner()) + expect(signature).toBe('0x5325ae62cdfd7d7c15101c611adcb159439217a48193c4e1d87ca5de698ec5233b1a68fd1302fdbd5450618d40739904295c88e88cf79d4241cf8736c2ec75731b') + } + }) }) From bccebcb580e91f55a68a0aae864dcc48cf370bfa Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Mon, 22 Mar 2021 11:33:43 +0200 Subject: [PATCH 2/5] fix: withdraw amount can be a string --- src/dataunion/DataUnion.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dataunion/DataUnion.ts b/src/dataunion/DataUnion.ts index cb178fdf5..30872e2f2 100644 --- a/src/dataunion/DataUnion.ts +++ b/src/dataunion/DataUnion.ts @@ -235,7 +235,7 @@ export class DataUnion { /** @internal */ async _createWithdrawSignature(amountTokenWei: BigNumber|number|string, to: EthereumAddress, withdrawn: BigNumber, signer: JsonRpcSigner) { // @ts-expect-error - const message = to + hexZeroPad(amountTokenWei, 32).slice(2) + this.getSidechainAddress().slice(2) + hexZeroPad(withdrawn, 32).slice(2) + const message = to + hexZeroPad(BigNumber.from(amountTokenWei), 32).slice(2) + this.getSidechainAddress().slice(2) + hexZeroPad(withdrawn, 32).slice(2) const signature = await signer.signMessage(arrayify(message)) return signature } From 7acfe43e302efce64099aabf7519fdfebd7e83ad Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Mon, 22 Mar 2021 11:33:57 +0200 Subject: [PATCH 3/5] refactor: use supported parameter type when calling hexZeroPad() --- src/dataunion/DataUnion.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dataunion/DataUnion.ts b/src/dataunion/DataUnion.ts index 30872e2f2..7e135998f 100644 --- a/src/dataunion/DataUnion.ts +++ b/src/dataunion/DataUnion.ts @@ -234,8 +234,7 @@ export class DataUnion { /** @internal */ async _createWithdrawSignature(amountTokenWei: BigNumber|number|string, to: EthereumAddress, withdrawn: BigNumber, signer: JsonRpcSigner) { - // @ts-expect-error - const message = to + hexZeroPad(BigNumber.from(amountTokenWei), 32).slice(2) + this.getSidechainAddress().slice(2) + hexZeroPad(withdrawn, 32).slice(2) + const message = to + hexZeroPad(BigNumber.from(amountTokenWei).toHexString(), 32).slice(2) + this.getSidechainAddress().slice(2) + hexZeroPad(withdrawn.toHexString(), 32).slice(2) const signature = await signer.signMessage(arrayify(message)) return signature } From f87b7f62faabf28ac44f9807c318c091a292259b Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Mon, 22 Mar 2021 11:34:15 +0200 Subject: [PATCH 4/5] style: eslint --- src/dataunion/DataUnion.ts | 12 ++++++++++-- test/integration/dataunion/signature.test.ts | 11 ++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/dataunion/DataUnion.ts b/src/dataunion/DataUnion.ts index 7e135998f..fb5a35804 100644 --- a/src/dataunion/DataUnion.ts +++ b/src/dataunion/DataUnion.ts @@ -233,8 +233,16 @@ export class DataUnion { } /** @internal */ - async _createWithdrawSignature(amountTokenWei: BigNumber|number|string, to: EthereumAddress, withdrawn: BigNumber, signer: JsonRpcSigner) { - const message = to + hexZeroPad(BigNumber.from(amountTokenWei).toHexString(), 32).slice(2) + this.getSidechainAddress().slice(2) + hexZeroPad(withdrawn.toHexString(), 32).slice(2) + async _createWithdrawSignature( + amountTokenWei: BigNumber|number|string, + to: EthereumAddress, + withdrawn: BigNumber, + signer: JsonRpcSigner + ) { + const message = to + + hexZeroPad(BigNumber.from(amountTokenWei).toHexString(), 32).slice(2) + + this.getSidechainAddress().slice(2) + + hexZeroPad(withdrawn.toHexString(), 32).slice(2) const signature = await signer.signMessage(arrayify(message)) return signature } diff --git a/test/integration/dataunion/signature.test.ts b/test/integration/dataunion/signature.test.ts index a7520280e..bf60b5c16 100644 --- a/test/integration/dataunion/signature.test.ts +++ b/test/integration/dataunion/signature.test.ts @@ -84,10 +84,11 @@ describe('DataUnion signature', () => { const dataUnion = client.getDataUnion('0x2222222222222222222222222222222222222222') const to = '0x3333333333333333333333333333333333333333' const withdrawn = BigNumber.from('4000000000000000') - // 0.005 tokens - for (const amount of [5000000000000000, '5000000000000000', BigNumber.from('5000000000000000')]) { - const signature = await dataUnion._createWithdrawSignature(amount, to, withdrawn, client.ethereum.getSigner()) - expect(signature).toBe('0x5325ae62cdfd7d7c15101c611adcb159439217a48193c4e1d87ca5de698ec5233b1a68fd1302fdbd5450618d40739904295c88e88cf79d4241cf8736c2ec75731b') - } + const amounts = [5000000000000000, '5000000000000000', BigNumber.from('5000000000000000')] + // eslint-disable-next-line no-underscore-dangle + const signaturePromises = amounts.map((amount) => dataUnion._createWithdrawSignature(amount, to, withdrawn, client.ethereum.getSigner())) + const actualSignatures = await Promise.all(signaturePromises) + const expectedSignature = '0x5325ae62cdfd7d7c15101c611adcb159439217a48193c4e1d87ca5de698ec5233b1a68fd1302fdbd5450618d40739904295c88e88cf79d4241cf8736c2ec75731b' // eslint-disable-line max-len + expect(actualSignatures.every((actual) => actual === expectedSignature)) }) }) From 6e9c523157228bc16dcc2104788a046791aa4731 Mon Sep 17 00:00:00 2001 From: Teo Gebhard Date: Mon, 22 Mar 2021 11:42:37 +0200 Subject: [PATCH 5/5] style: typo --- test/integration/dataunion/signature.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/dataunion/signature.test.ts b/test/integration/dataunion/signature.test.ts index bf60b5c16..ae6662e93 100644 --- a/test/integration/dataunion/signature.test.ts +++ b/test/integration/dataunion/signature.test.ts @@ -75,7 +75,7 @@ describe('DataUnion signature', () => { expect(isValid3).toBe(true) }, 100000) - it('create signatute', async () => { + it('create signature', async () => { const client = new StreamrClient({ auth: { privateKey: '0x1111111111111111111111111111111111111111111111111111111111111111'