From f7ec8f0e346b992e3179b00ec9b17273d8e696f5 Mon Sep 17 00:00:00 2001 From: Harsh Date: Sun, 6 Aug 2023 22:27:09 +0530 Subject: [PATCH 01/23] feat(jellyfish-api-core) enable transferdomain gov attributes --- apps/playground-api/src/setups/setup.gov.ts | 6 +- apps/whale-api/docker-compose.yml | 3 +- .../category/account/getTokenBalances.test.ts | 6 +- .../category/account/transferDomain.test.ts | 213 +++++++++++++----- .../__tests__/category/evm/evmTx.test.ts | 8 +- ...xn_builder_account_transfer_domain.test.ts | 6 +- .../src/containers/DeFiDContainer.ts | 2 +- .../src/containers/NativeChainContainer.ts | 3 +- .../src/containers/RegTestContainer/index.ts | 1 - 9 files changed, 176 insertions(+), 72 deletions(-) diff --git a/apps/playground-api/src/setups/setup.gov.ts b/apps/playground-api/src/setups/setup.gov.ts index 7f1fe98f90..8ae4f817ef 100644 --- a/apps/playground-api/src/setups/setup.gov.ts +++ b/apps/playground-api/src/setups/setup.gov.ts @@ -155,7 +155,11 @@ export class SetupGov extends PlaygroundSetup> { await this.client.masternode.setGov({ ATTRIBUTES: { - 'v0/params/feature/evm': 'true' + 'v0/params/feature/evm': 'true', + 'v0/params/feature/transferdomain': 'true', + 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/dvm-evm/dat-enabled': 'true', + 'v0/transferdomain/evm-dvm/dat-enabled': 'true' } }) await this.generate(1) diff --git a/apps/whale-api/docker-compose.yml b/apps/whale-api/docker-compose.yml index 00d94820cc..e24dd0c620 100644 --- a/apps/whale-api/docker-compose.yml +++ b/apps/whale-api/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.7' services: defi-blockchain: - image: defi/defichain:master-91a01aea0 + image: defi/defichain:4.0.0-beta8 ports: - "19554:19554" command: > @@ -42,7 +42,6 @@ services: -grandcentralheight=16 -grandcentralepilogueheight=17 -nextnetworkupgradeheight=18 - -changiintermediateheight=19 -regtest-skip-loan-collateral-validation -regtest-minttoken-simulate-mainnet=0 diff --git a/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts b/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts index eb1d3f4a38..510b1045e5 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts @@ -104,7 +104,11 @@ describe('Account', () => { it('should getTokenBalances with including eth', async () => { await client.masternode.setGov({ ATTRIBUTES: { - 'v0/params/feature/evm': 'true' + 'v0/params/feature/evm': 'true', + 'v0/params/feature/transferdomain': 'true', + 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/dvm-evm/dat-enabled': 'true', + 'v0/transferdomain/evm-dvm/dat-enabled': 'true' } }) await container.generate(1) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index af784c8a88..ee0eaae056 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -15,12 +15,16 @@ describe('TransferDomain', () => { await client.masternode.setGov({ ATTRIBUTES: { - 'v0/params/feature/evm': 'true' + 'v0/params/feature/evm': 'true', + 'v0/params/feature/transferdomain': 'true', + 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/dvm-evm/dat-enabled': 'true', + 'v0/transferdomain/evm-dvm/dat-enabled': 'true' } }) await container.generate(1) - dvmAddr = await container.call('getnewaddress') + dvmAddr = await container.getNewAddress('address1', 'legacy') evmAddr = await container.getNewAddress('eth', 'eth') await container.call('utxostoaccount', [{ [dvmAddr]: '100@0' }]) @@ -34,9 +38,18 @@ describe('TransferDomain', () => { tradeable: true, collateralAddress: dvmAddr }]) + await container.call('createtoken', [{ + symbol: 'ETH', + name: 'ETH', + isDAT: true, + mintable: true, + tradeable: true, + collateralAddress: dvmAddr + }]) await container.generate(1) await container.call('minttokens', ['10@BTC']) + await container.call('minttokens', ['10@ETH']) await container.generate(1) }) @@ -83,7 +96,7 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow('Source amount must be equal to destination amount') }) - it('should fail if transfer other than DFI token', async () => { + it('should fail if transfer diff src and dst token', async () => { const promise = client.account.transferDomain([ { src: { @@ -99,7 +112,7 @@ describe('TransferDomain', () => { } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('For transferdomain, only DFI token is currently supported') + await expect(promise).rejects.toThrow('Source token and destination token must be the same') }) it('(dvm -> evm) should fail if source address and source domain are not match', async () => { @@ -137,7 +150,7 @@ describe('TransferDomain', () => { } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Src address must be an ETH address in case of "EVM" domain') + await expect(promise).rejects.toThrow('Src address must be an ERC55 address in case of "EVM" domain') }) it('(dvm -> evm) should fail if destination address and destination domain are not match', async () => { @@ -156,7 +169,7 @@ describe('TransferDomain', () => { } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Dst address must be an ETH address in case of "EVM" domain') + await expect(promise).rejects.toThrow('Dst address must be an ERC55 address in case of "EVM" domain') }) it('(evm -> dvm) should fail if destination address and destination domain are not match', async () => { @@ -296,6 +309,7 @@ describe('TransferDomain', () => { it('should Transfer Domain from DVM to EVM', async () => { const dvmAcc = await client.account.getAccount(dvmAddr) const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') + const prevBalance = await getEVMBalances(client) const txid = await client.account.transferDomain([ { @@ -320,23 +334,86 @@ describe('TransferDomain', () => { expect(tokenId1).toStrictEqual(tokenId0) // check: dvm balance is transferred - expect(new BigNumber(dvmBalance1)) - .toStrictEqual(new BigNumber(dvmBalance0).minus(3)) + expect(new BigNumber(dvmBalance0)) + .toStrictEqual(new BigNumber(dvmBalance1).plus(3)) // check: evm balance = dvm balance - transferred - const withoutEthRes = await client.account.getTokenBalances({}, false) - const [withoutEth] = withoutEthRes[0].split('@') + const currentBalance = await getEVMBalances(client) + expect(new BigNumber(prevBalance)) + .toStrictEqual(new BigNumber(currentBalance).minus(3)) + }) + + it('should Transfer Domain dToken from DVM to EVM', async () => { + const dvmAcc = (await client.account.getAccount(dvmAddr)) + const [btcBalance, btcTokenId] = dvmAcc[1]?.split('@') + const [ethBalance, ethTokenId] = dvmAcc[2].split('@') + const txid1 = await client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@BTC', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '3@BTC', + domain: TransferDomainType.EVM + } + } + ]) + expect(typeof txid1).toStrictEqual('string') + expect(txid1.length).toStrictEqual(64) + const txid2 = await client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@ETH', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '3@ETH', + domain: TransferDomainType.EVM + } + } + ]) + await client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@DFI', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '3@DFI', + domain: TransferDomainType.EVM + } + } + ]) + expect(typeof txid2).toStrictEqual('string') + expect(txid2.length).toStrictEqual(64) + await container.generate(1) - const withEthRes = await client.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth)) - .toStrictEqual(new BigNumber(withEth).minus(3)) + const dvmAcc1 = await client.account.getAccount(dvmAddr) + + const [btcBalance1, btcTokenId1] = dvmAcc1[1]?.split('@') + const [ethBalance1, ethTokenId1] = dvmAcc1[2].split('@') + expect(btcTokenId).toStrictEqual(btcTokenId1) + expect(ethTokenId).toStrictEqual(ethTokenId1) + + // check: BTC balance is transferred + expect(new BigNumber(btcBalance1)) + .toStrictEqual(new BigNumber(btcBalance).minus(3)) + // check: ETH balance is transferred + expect(new BigNumber(ethBalance1)) + .toStrictEqual(new BigNumber(ethBalance).minus(3)) }) it('should Transfer Domain from EVM to DVM', async () => { const dvmAcc = await client.account.getAccount(dvmAddr) const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') - + const prevBalance = await getEVMBalances(client) const txid = await client.account.transferDomain([ { src: { @@ -359,22 +436,21 @@ describe('TransferDomain', () => { const dvmAcc1 = await client.account.getAccount(dvmAddr) const [dvmBalance1, tokenId1] = dvmAcc1[0].split('@') expect(tokenId1).toStrictEqual(tokenId0) - expect(new BigNumber(dvmBalance1)) - .toStrictEqual(new BigNumber(dvmBalance0).plus(3)) - - // check eth balance to be equal to zero - const withoutEthRes = await client.account.getTokenBalances({}, false) - const [withoutEth] = withoutEthRes[0].split('@') - const withEthRes = await client.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth)).toStrictEqual(new BigNumber(withEth)) + expect(new BigNumber(dvmBalance0)) + .toStrictEqual(new BigNumber(dvmBalance1).minus(3)) + + // check EVM balance + const currentBalance = await getEVMBalances(client) + expect(new BigNumber(prevBalance)) + .toStrictEqual(new BigNumber(currentBalance).plus(3)) }) it('should (duo) Transfer Domain from DVM to EVM', async () => { const dvmAcc = await client.account.getAccount(dvmAddr) const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') + const prevBalance = await getEVMBalances(client) - const txid = await client.account.transferDomain([ + const txid1 = await client.account.transferDomain([ { src: { address: dvmAddr, @@ -386,7 +462,11 @@ describe('TransferDomain', () => { amount: '3@DFI', domain: TransferDomainType.EVM } - }, + } + ]) + expect(typeof txid1).toStrictEqual('string') + expect(txid1.length).toStrictEqual(64) + const txid2 = await client.account.transferDomain([ { src: { address: dvmAddr, @@ -400,8 +480,8 @@ describe('TransferDomain', () => { } } ]) - expect(typeof txid).toStrictEqual('string') - expect(txid.length).toStrictEqual(64) + expect(typeof txid2).toStrictEqual('string') + expect(txid2.length).toStrictEqual(64) await container.generate(1) const dvmAcc1 = await client.account.getAccount(dvmAddr) @@ -409,24 +489,21 @@ describe('TransferDomain', () => { expect(tokenId1).toStrictEqual(tokenId0) // check: dvm balance is transferred - expect(new BigNumber(dvmBalance1)) - .toStrictEqual(new BigNumber(dvmBalance0).minus(3 + 4)) - - // check: evm balance = dvm balance - transferred - const withoutEthRes = await client.account.getTokenBalances({}, false) - const [withoutEth] = withoutEthRes[0].split('@') + expect(new BigNumber(dvmBalance0)) + .toStrictEqual(new BigNumber(dvmBalance1).plus(3 + 4)) - const withEthRes = await client.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth)) - .toStrictEqual(new BigNumber(withEth).minus(3 + 4)) + // check EVM balance + const currentBalance = await getEVMBalances(client) + expect(new BigNumber(prevBalance)) + .toStrictEqual(new BigNumber(currentBalance).minus(3 + 4)) }) it('should (duo) Transfer Domain from EVM to DVM', async () => { const dvmAcc = await client.account.getAccount(dvmAddr) const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') + const prevBalance = await getEVMBalances(client) - const txid = await client.account.transferDomain([ + const txid1 = await client.account.transferDomain([ { src: { address: evmAddr, @@ -438,7 +515,11 @@ describe('TransferDomain', () => { amount: '3@DFI', domain: TransferDomainType.DVM } - }, + } + ]) + expect(typeof txid1).toStrictEqual('string') + expect(txid1.length).toStrictEqual(64) + const txid2 = await client.account.transferDomain([ { src: { address: evmAddr, @@ -452,23 +533,20 @@ describe('TransferDomain', () => { } } ]) - expect(typeof txid).toStrictEqual('string') - expect(txid.length).toStrictEqual(64) - + expect(typeof txid2).toStrictEqual('string') + expect(txid2.length).toStrictEqual(64) await container.generate(1) const dvmAcc1 = await client.account.getAccount(dvmAddr) const [dvmBalance1, tokenId1] = dvmAcc1[0].split('@') expect(tokenId1).toStrictEqual(tokenId0) - expect(new BigNumber(dvmBalance1)) - .toStrictEqual(new BigNumber(dvmBalance0).plus(3 + 4)) - - // check eth balance to be equal to zero - const withoutEthRes = await client.account.getTokenBalances({}, false) - const [withoutEth] = withoutEthRes[0].split('@') - const withEthRes = await client.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth)).toStrictEqual(new BigNumber(withEth)) + expect(new BigNumber(dvmBalance0)) + .toStrictEqual(new BigNumber(dvmBalance1).minus(3 + 4)) + + // check EVM balance + const currentBalance = await getEVMBalances(client) + expect(new BigNumber(prevBalance)) + .toStrictEqual(new BigNumber(currentBalance).plus(3 + 4)) }) it('should (duo-diff) Transfer Domain from EVM to DVM and DVM to EVM', async () => { @@ -491,9 +569,10 @@ describe('TransferDomain', () => { const dvmAcc = await client.account.getAccount(dvmAddr) const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') + const prevBalance = await getEVMBalances(client) // start - const txid = await client.account.transferDomain([ + const txid1 = await client.account.transferDomain([ { src: { address: dvmAddr, @@ -505,7 +584,11 @@ describe('TransferDomain', () => { amount: '4@DFI', domain: TransferDomainType.EVM } - }, + } + ]) + expect(typeof txid1).toStrictEqual('string') + expect(txid1.length).toStrictEqual(64) + const txid2 = await client.account.transferDomain([ { src: { address: evmAddr, @@ -519,22 +602,28 @@ describe('TransferDomain', () => { } } ]) - expect(typeof txid).toStrictEqual('string') - expect(txid.length).toStrictEqual(64) + expect(typeof txid2).toStrictEqual('string') + expect(txid2.length).toStrictEqual(64) await container.generate(1) const dvmAcc1 = await client.account.getAccount(dvmAddr) const [dvmBalance1, tokenId1] = dvmAcc1[0].split('@') expect(tokenId1).toStrictEqual(tokenId0) + expect(new BigNumber(dvmBalance1)) .toStrictEqual(new BigNumber(dvmBalance0).plus(3 - 4)) - // check eth balance to be equal to zero - const withoutEthRes = await client.account.getTokenBalances({}, false) - const [withoutEth] = withoutEthRes[0].split('@') - const withEthRes = await client.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth).plus(4)).toStrictEqual(new BigNumber(withEth)) + const currentBalance = await getEVMBalances(client) + expect(new BigNumber(prevBalance)) + .toStrictEqual(new BigNumber(currentBalance).plus(3 - 4)) }) }) + +async function getEVMBalances (client: ContainerAdapterClient): Promise { + const withoutEthRes = await client.account.getTokenBalances({}, false) + const [withoutEth] = withoutEthRes[0].split('@') + const withEthRes = await client.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) + const [withEth] = withEthRes[0].split('@') + return new BigNumber(withEth).minus(withoutEth) +} diff --git a/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts b/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts index 8993fb2f2f..30ddb16e4d 100644 --- a/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts @@ -24,7 +24,13 @@ describe('EVMTX', () => { await container.start() await container.waitForWalletCoinbaseMaturity() await testing.rpc.masternode.setGov({ - ATTRIBUTES: { 'v0/params/feature/evm': 'true' } + ATTRIBUTES: { + 'v0/params/feature/evm': 'true', + 'v0/params/feature/transferdomain': 'true', + 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/dvm-evm/dat-enabled': 'true', + 'v0/transferdomain/evm-dvm/dat-enabled': 'true' + } }) await container.generate(1) dfiAddress = await container.call('getnewaddress') diff --git a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts index cdf4ca5c6a..5a9e298947 100644 --- a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts +++ b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts @@ -35,7 +35,11 @@ describe('transferDomain', () => { await testing.rpc.masternode.setGov({ ATTRIBUTES: { - 'v0/params/feature/evm': 'true' + 'v0/params/feature/evm': 'true', + 'v0/params/feature/transferdomain': 'true', + 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/dvm-evm/dat-enabled': 'true', + 'v0/transferdomain/evm-dvm/dat-enabled': 'true' } }) await testing.generate(1) diff --git a/packages/testcontainers/src/containers/DeFiDContainer.ts b/packages/testcontainers/src/containers/DeFiDContainer.ts index 5ef9476938..50c54f29af 100644 --- a/packages/testcontainers/src/containers/DeFiDContainer.ts +++ b/packages/testcontainers/src/containers/DeFiDContainer.ts @@ -36,7 +36,7 @@ export abstract class DeFiDContainer extends DockerContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:master-91a01aea0' // renovate.json regexManagers + return 'defi/defichain:4.0.0-beta8' // renovate.json regexManagers } public static readonly DefaultStartOptions = { diff --git a/packages/testcontainers/src/containers/NativeChainContainer.ts b/packages/testcontainers/src/containers/NativeChainContainer.ts index 10c6a7ab0f..c5d7200fe8 100644 --- a/packages/testcontainers/src/containers/NativeChainContainer.ts +++ b/packages/testcontainers/src/containers/NativeChainContainer.ts @@ -29,7 +29,7 @@ export class NativeChainContainer extends GenericContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:master-91a01aea0' // renovate.json regexManagers + return 'defi/defichain:4.0.0-beta8' // renovate.json regexManagers } public static readonly PREFIX = 'defichain-testcontainers-' @@ -119,7 +119,6 @@ export class NativeChainContainer extends GenericContainer { '-grandcentralheight=16', '-grandcentralepilogueheight=17', '-nextnetworkupgradeheight=18', - '-changiintermediateheight=19', '-regtest-skip-loan-collateral-validation', '-regtest-minttoken-simulate-mainnet=0' ], diff --git a/packages/testcontainers/src/containers/RegTestContainer/index.ts b/packages/testcontainers/src/containers/RegTestContainer/index.ts index 11203c0790..e667fe6af4 100644 --- a/packages/testcontainers/src/containers/RegTestContainer/index.ts +++ b/packages/testcontainers/src/containers/RegTestContainer/index.ts @@ -43,7 +43,6 @@ export class RegTestContainer extends DeFiDContainer { '-grandcentralheight=16', '-grandcentralepilogueheight=17', '-nextnetworkupgradeheight=18', - '-changiintermediateheight=19', '-regtest-skip-loan-collateral-validation', '-regtest-minttoken-simulate-mainnet=0', '-rpc-governance-accept-neutral=1' From 0f50188de32cd133d7c6cade244ab638b7f53462 Mon Sep 17 00:00:00 2001 From: Harsh Date: Tue, 8 Aug 2023 09:42:09 +0530 Subject: [PATCH 02/23] fix testcase --- .../category/account/transferDomain.test.ts | 140 +------- ...xn_builder_account_transfer_domain.test.ts | 298 +++++++++--------- 2 files changed, 165 insertions(+), 273 deletions(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index ee0eaae056..47d225deaa 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -445,65 +445,39 @@ describe('TransferDomain', () => { .toStrictEqual(new BigNumber(currentBalance).plus(3)) }) - it('should (duo) Transfer Domain from DVM to EVM', async () => { - const dvmAcc = await client.account.getAccount(dvmAddr) - const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') - const prevBalance = await getEVMBalances(client) - - const txid1 = await client.account.transferDomain([ + it('should fail (duo) Transfer Domain from DVM to EVM', async () => { + const promise = client.account.transferDomain([ { src: { address: dvmAddr, - amount: '3@DFI', + amount: '1@DFI', domain: TransferDomainType.DVM }, dst: { address: evmAddr, - amount: '3@DFI', + amount: '1@DFI', domain: TransferDomainType.EVM } - } - ]) - expect(typeof txid1).toStrictEqual('string') - expect(txid1.length).toStrictEqual(64) - const txid2 = await client.account.transferDomain([ + }, { src: { address: dvmAddr, - amount: '4@DFI', + amount: '1@DFI', domain: TransferDomainType.DVM }, dst: { address: evmAddr, - amount: '4@DFI', + amount: '1@DFI', domain: TransferDomainType.EVM } } ]) - expect(typeof txid2).toStrictEqual('string') - expect(txid2.length).toStrictEqual(64) - await container.generate(1) - - const dvmAcc1 = await client.account.getAccount(dvmAddr) - const [dvmBalance1, tokenId1] = dvmAcc1[0].split('@') - expect(tokenId1).toStrictEqual(tokenId0) - - // check: dvm balance is transferred - expect(new BigNumber(dvmBalance0)) - .toStrictEqual(new BigNumber(dvmBalance1).plus(3 + 4)) - - // check EVM balance - const currentBalance = await getEVMBalances(client) - expect(new BigNumber(prevBalance)) - .toStrictEqual(new BigNumber(currentBalance).minus(3 + 4)) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') }) - it('should (duo) Transfer Domain from EVM to DVM', async () => { - const dvmAcc = await client.account.getAccount(dvmAddr) - const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') - const prevBalance = await getEVMBalances(client) - - const txid1 = await client.account.transferDomain([ + it('should fail (duo) Transfer Domain from EVM to DVM', async () => { + const promise = client.account.transferDomain([ { src: { address: evmAddr, @@ -515,11 +489,7 @@ describe('TransferDomain', () => { amount: '3@DFI', domain: TransferDomainType.DVM } - } - ]) - expect(typeof txid1).toStrictEqual('string') - expect(txid1.length).toStrictEqual(64) - const txid2 = await client.account.transferDomain([ + }, { src: { address: evmAddr, @@ -533,90 +503,8 @@ describe('TransferDomain', () => { } } ]) - expect(typeof txid2).toStrictEqual('string') - expect(txid2.length).toStrictEqual(64) - await container.generate(1) - - const dvmAcc1 = await client.account.getAccount(dvmAddr) - const [dvmBalance1, tokenId1] = dvmAcc1[0].split('@') - expect(tokenId1).toStrictEqual(tokenId0) - expect(new BigNumber(dvmBalance0)) - .toStrictEqual(new BigNumber(dvmBalance1).minus(3 + 4)) - - // check EVM balance - const currentBalance = await getEVMBalances(client) - expect(new BigNumber(prevBalance)) - .toStrictEqual(new BigNumber(currentBalance).plus(3 + 4)) - }) - - it('should (duo-diff) Transfer Domain from EVM to DVM and DVM to EVM', async () => { - // transfer some to evm first - await client.account.transferDomain([ - { - src: { - address: dvmAddr, - amount: '3@DFI', - domain: TransferDomainType.DVM - }, - dst: { - address: evmAddr, - amount: '3@DFI', - domain: TransferDomainType.EVM - } - } - ]) - await container.generate(1) - - const dvmAcc = await client.account.getAccount(dvmAddr) - const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') - const prevBalance = await getEVMBalances(client) - - // start - const txid1 = await client.account.transferDomain([ - { - src: { - address: dvmAddr, - amount: '4@DFI', - domain: TransferDomainType.DVM - }, - dst: { - address: evmAddr, - amount: '4@DFI', - domain: TransferDomainType.EVM - } - } - ]) - expect(typeof txid1).toStrictEqual('string') - expect(txid1.length).toStrictEqual(64) - const txid2 = await client.account.transferDomain([ - { - src: { - address: evmAddr, - amount: '3@DFI', - domain: TransferDomainType.EVM - }, - dst: { - address: dvmAddr, - amount: '3@DFI', - domain: TransferDomainType.DVM - } - } - ]) - expect(typeof txid2).toStrictEqual('string') - expect(txid2.length).toStrictEqual(64) - - await container.generate(1) - - const dvmAcc1 = await client.account.getAccount(dvmAddr) - const [dvmBalance1, tokenId1] = dvmAcc1[0].split('@') - expect(tokenId1).toStrictEqual(tokenId0) - - expect(new BigNumber(dvmBalance1)) - .toStrictEqual(new BigNumber(dvmBalance0).plus(3 - 4)) - - const currentBalance = await getEVMBalances(client) - expect(new BigNumber(prevBalance)) - .toStrictEqual(new BigNumber(currentBalance).plus(3 - 4)) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') }) }) diff --git a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts index 5a9e298947..58d64bc1d4 100644 --- a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts +++ b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts @@ -52,6 +52,25 @@ describe('transferDomain', () => { evmScript = await providers.elliptic.evmScript() await testing.token.dfi({ address: dvmAddr, amount: 12 }) + await testing.token.create({ + symbol: 'BTC', + name: 'BTC', + isDAT: true, + mintable: true, + tradeable: true, + collateralAddress: dvmAddr + }) + await testing.token.create({ + symbol: 'ETH', + name: 'ETH', + isDAT: true, + mintable: true, + tradeable: true, + collateralAddress: dvmAddr + }) + await container.generate(1) + await testing.token.mint({ amount: '10', symbol: 'BTC' }) + await testing.token.mint({ amount: '10', symbol: 'ETH' }) await testing.generate(1) // Fund 100 DFI UTXO @@ -131,36 +150,6 @@ describe('transferDomain', () => { await expect(promise).rejects.toThrow('DeFiDRpcError: \'TransferDomainTx: Source amount must be equal to destination amount (code 16)') }) - it('should fail if transfer other than DFI token', async () => { - const transferDomain: TransferDomain = { - items: [{ - src: - { - address: dvmScript, - domain: TRANSFER_DOMAIN_TYPE.DVM, - amount: { - token: 1, // <- not DFI - amount: new BigNumber(3) - } - }, - dst: { - address: evmScript, - domain: TRANSFER_DOMAIN_TYPE.EVM, - amount: { - token: 1, // <- not DFI - amount: new BigNumber(3) - } - } - }] - } - - const txn = await builder.account.transferDomain(transferDomain, dvmScript) - const promise = sendTransaction(testing.container, txn) - - await expect(promise).rejects.toThrow(DeFiDRpcError) - await expect(promise).rejects.toThrow('DeFiDRpcError: \'TransferDomainTx: For transferdomain, only DFI token is currently supported (code 16)') - }) - it('(dvm -> evm) should fail if source address and source domain are not match', async () => { const transferDomain: TransferDomain = { items: [{ @@ -218,7 +207,7 @@ describe('transferDomain', () => { const promise = sendTransaction(testing.container, txn) await expect(promise).rejects.toThrow(DeFiDRpcError) - await expect(promise).rejects.toThrow('DeFiDRpcError: \'TransferDomainTx: Src address must be an ETH address in case of "EVM" domain (code 16)\', code: -26') + await expect(promise).rejects.toThrow('DeFiDRpcError: \'TransferDomainTx: Src address must be an ERC55 address in case of "EVM" domain (code 16)\', code: -26') }) it('(dvm -> evm) should fail if destination address and destination domain are not match', async () => { @@ -248,7 +237,7 @@ describe('transferDomain', () => { const promise = sendTransaction(testing.container, txn) await expect(promise).rejects.toThrow(DeFiDRpcError) - await expect(promise).rejects.toThrow('DeFiDRpcError: \'TransferDomainTx: Dst address must be an ETH address in case of "EVM" domain (code 16)') + await expect(promise).rejects.toThrow('DeFiDRpcError: \'TransferDomainTx: Dst address must be an ERC55 address in case of "EVM" domain (code 16)') }) it('(evm -> dvm) should fail if destination address and destination domain are not match', async () => { @@ -317,6 +306,7 @@ describe('transferDomain', () => { it('should transfer domain from DVM to EVM', async () => { const dvmAccBefore = await testing.rpc.account.getAccount(dvmAddr) const [dvmBalanceBefore0, tokenIdBefore0] = dvmAccBefore[0].split('@') + const prevBalance = await getEVMBalances(testing) const transferDomain: TransferDomain = { items: [{ @@ -370,18 +360,15 @@ describe('transferDomain', () => { .toStrictEqual(new BigNumber(dvmBalanceBefore0).minus(3)) // check: evm balance = dvm balance - transferred - const withoutEthRes = await testing.rpc.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: false }) - const [withoutEth] = withoutEthRes[0].split('@') - - const withEthRes = await testing.rpc.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth)) - .toStrictEqual(new BigNumber(withEth).minus(3)) + const currentBalance = await getEVMBalances(testing) + expect(new BigNumber(prevBalance)) + .toStrictEqual(new BigNumber(currentBalance).minus(3)) }) it('should transfer domain from EVM to DVM', async () => { const dvmAccBefore = await testing.rpc.account.getAccount(dvmAddr) const [dvmBalanceBefore0, tokenIdBefore0] = dvmAccBefore[0].split('@') + const prevBalance = await getEVMBalances(testing) const transferDomain: TransferDomain = { items: [{ @@ -435,16 +422,14 @@ describe('transferDomain', () => { .toStrictEqual(new BigNumber(dvmBalanceBefore0).plus(3)) // check evm balance to be equal to zero - const withoutEthRes = await testing.rpc.account.getTokenBalances({}, false) - const [withoutEth] = withoutEthRes[0].split('@') - const withEthRes = await testing.rpc.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth)).toStrictEqual(new BigNumber(withEth)) + const currentBalance = await getEVMBalances(testing) + expect(new BigNumber(prevBalance)) + .toStrictEqual(new BigNumber(currentBalance).plus(3)) }) - it('should (duo) transfer domain from DVM to EVM', async () => { + it('should transfer domain dToken from DVM to EVM', async () => { const dvmAccBefore = await testing.rpc.account.getAccount(dvmAddr) - const [dvmBalanceBefore0, tokenIdBefore0] = dvmAccBefore[0].split('@') + const [dvmBalanceBefore0, tokenIdBefore0] = dvmAccBefore[1].split('@') const transferDomain: TransferDomain = { items: [{ @@ -453,43 +438,75 @@ describe('transferDomain', () => { address: dvmScript, domain: TRANSFER_DOMAIN_TYPE.DVM, amount: { - token: 0, - amount: new BigNumber(2) - }, - data: [0] + token: 1, // <- BTC + amount: new BigNumber(3) + } }, dst: { address: evmScript, domain: TRANSFER_DOMAIN_TYPE.EVM, amount: { - token: 0, - amount: new BigNumber(2) - }, - data: [0] + token: 1, // <- BTC + amount: new BigNumber(3) + } } - }, - { + }] + } + + const txn = await builder.account.transferDomain(transferDomain, dvmScript) + const outs = await sendTransaction(container, txn) + const encoded: string = OP_CODES.OP_DEFI_TX_TRANSFER_DOMAIN(transferDomain).asBuffer().toString('hex') + const expectedTransferDomainScript = `6a${encoded}` + + expect(outs.length).toStrictEqual(2) + expect(outs[0].value).toStrictEqual(0) + expect(outs[0].n).toStrictEqual(0) + expect(outs[0].tokenId).toStrictEqual(0) + expect(outs[0].scriptPubKey.asm.startsWith('OP_RETURN 4466547838')).toStrictEqual(true) + expect(outs[0].scriptPubKey.hex).toStrictEqual(expectedTransferDomainScript) + expect(outs[0].scriptPubKey.type).toStrictEqual('nulldata') + + expect(outs[1].value).toEqual(expect.any(Number)) + expect(outs[1].n).toStrictEqual(1) + expect(outs[1].tokenId).toStrictEqual(0) + expect(outs[1].scriptPubKey.type).toStrictEqual('witness_v0_keyhash') + expect(outs[1].scriptPubKey.addresses[0]).toStrictEqual(dvmAddr) + + const dvmAccAfter = await testing.rpc.account.getAccount(dvmAddr) + const [dvmBalanceAfter0, tokenIdAfter0] = dvmAccAfter[1].split('@') + expect(tokenIdBefore0).toStrictEqual(tokenIdAfter0) + + // check: dvm balance is transferred + expect(new BigNumber(dvmBalanceAfter0)) + .toStrictEqual(new BigNumber(dvmBalanceBefore0).minus(3)) + }) + + it('should transfer domain dToken from EVM to DVM', async () => { + const dvmAccBefore = await testing.rpc.account.getAccount(dvmAddr) + const [dvmBalanceBefore0, tokenIdBefore0] = dvmAccBefore[1].split('@') + + const transferDomain: TransferDomain = { + items: [{ src: { - address: dvmScript, - domain: TRANSFER_DOMAIN_TYPE.DVM, + address: evmScript, + domain: TRANSFER_DOMAIN_TYPE.EVM, amount: { - token: 0, - amount: new BigNumber(1.5) + token: 1, + amount: new BigNumber(3) }, data: [0] }, dst: { - address: evmScript, - domain: TRANSFER_DOMAIN_TYPE.EVM, + address: dvmScript, + domain: TRANSFER_DOMAIN_TYPE.DVM, amount: { - token: 0, - amount: new BigNumber(1.5) + token: 1, + amount: new BigNumber(3) }, data: [0] } - } - ] + }] } const txn = await builder.account.transferDomain(transferDomain, dvmScript) @@ -512,27 +529,66 @@ describe('transferDomain', () => { expect(outs[1].scriptPubKey.addresses[0]).toStrictEqual(dvmAddr) const dvmAccAfter = await testing.rpc.account.getAccount(dvmAddr) - const [dvmBalanceAfter0, tokenIdAfter0] = dvmAccAfter[0].split('@') + const [dvmBalanceAfter0, tokenIdAfter0] = dvmAccAfter[1].split('@') expect(tokenIdBefore0).toStrictEqual(tokenIdAfter0) - // check: dvm balance is transferred + // check: dev balance is updated expect(new BigNumber(dvmBalanceAfter0)) - .toStrictEqual(new BigNumber(dvmBalanceBefore0).minus(2 + 1.5)) + .toStrictEqual(new BigNumber(dvmBalanceBefore0).plus(3)) + }) - // check: evm balance = dvm balance - transferred - const withoutEthRes = await testing.rpc.account.getTokenBalances({}, false) - const [withoutEth] = withoutEthRes[0].split('@') + it('should fail (duo) transfer domain from DVM to EVM', async () => { + const transferDomain: TransferDomain = { + items: [{ + src: { + address: dvmScript, + domain: TRANSFER_DOMAIN_TYPE.DVM, + amount: { + token: 0, + amount: new BigNumber(2) + }, + data: [0] + }, + dst: { + address: evmScript, + domain: TRANSFER_DOMAIN_TYPE.EVM, + amount: { + token: 0, + amount: new BigNumber(2) + }, + data: [0] + } + }, { + src: + { + address: dvmScript, + domain: TRANSFER_DOMAIN_TYPE.DVM, + amount: { + token: 0, + amount: new BigNumber(1.5) + }, + data: [0] + }, + dst: { + address: evmScript, + domain: TRANSFER_DOMAIN_TYPE.EVM, + amount: { + token: 0, + amount: new BigNumber(1.5) + }, + data: [0] + } + }] + } - const withEthRes = await testing.rpc.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth)) - .toStrictEqual(new BigNumber(withEth).minus(2 + 1.5)) - }) + const txn = await builder.account.transferDomain(transferDomain, dvmScript) + const promise = sendTransaction(testing.container, txn) - it('should (duo) transfer domain from EVM to DVM', async () => { - const dvmAccBefore = await testing.rpc.account.getAccount(dvmAddr) - const [dvmBalanceBefore0, tokenIdBefore0] = dvmAccBefore[0].split('@') + await expect(promise).rejects.toThrow(DeFiDRpcError) + await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') + }) + it('should fail (duo) transfer domain from EVM to DVM', async () => { const transferDomain: TransferDomain = { items: [{ src: @@ -580,40 +636,13 @@ describe('transferDomain', () => { } const txn = await builder.account.transferDomain(transferDomain, dvmScript) - const outs = await sendTransaction(container, txn) - const encoded: string = OP_CODES.OP_DEFI_TX_TRANSFER_DOMAIN(transferDomain).asBuffer().toString('hex') - const expectedTransferDomainScript = `6a${encoded}` + const promise = sendTransaction(testing.container, txn) - expect(outs.length).toStrictEqual(2) - expect(outs[0].value).toStrictEqual(0) - expect(outs[0].n).toStrictEqual(0) - expect(outs[0].tokenId).toStrictEqual(0) - expect(outs[0].scriptPubKey.asm.startsWith('OP_RETURN 4466547838')).toStrictEqual(true) - expect(outs[0].scriptPubKey.hex).toStrictEqual(expectedTransferDomainScript) - expect(outs[0].scriptPubKey.type).toStrictEqual('nulldata') - - expect(outs[1].value).toEqual(expect.any(Number)) - expect(outs[1].n).toStrictEqual(1) - expect(outs[1].tokenId).toStrictEqual(0) - expect(outs[1].scriptPubKey.type).toStrictEqual('witness_v0_keyhash') - expect(outs[1].scriptPubKey.addresses[0]).toStrictEqual(dvmAddr) - - const dvmAccAfter = await testing.rpc.account.getAccount(dvmAddr) - const [dvmBalanceAfter0, tokenIdAfter0] = dvmAccAfter[0].split('@') - expect(tokenIdBefore0).toStrictEqual(tokenIdAfter0) - - expect(new BigNumber(dvmBalanceAfter0)) - .toStrictEqual(new BigNumber(dvmBalanceBefore0).plus(2 + 1.5)) - - const withoutEthRes = await testing.rpc.account.getTokenBalances({}, false) - const [withoutEth] = withoutEthRes[0].split('@') - - const withEthRes = await testing.rpc.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth)).toStrictEqual(new BigNumber(withEth)) + await expect(promise).rejects.toThrow(DeFiDRpcError) + await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') }) - it('should (duo-diff) Transfer Domain from EVM to DVM and DVM to EVM', async () => { + it('should fail (duo-diff) Transfer Domain from EVM to DVM and DVM to EVM', async () => { // transfer some to evm first { const transferDomain: TransferDomain = { @@ -644,9 +673,6 @@ describe('transferDomain', () => { await sendTransaction(container, txn) } - const dvmAccBefore = await testing.rpc.account.getAccount(dvmAddr) - const [dvmBalanceBefore0, tokenIdBefore0] = dvmAccBefore[0].split('@') - // start const transferDomain: TransferDomain = { items: [{ @@ -695,38 +721,16 @@ describe('transferDomain', () => { } const txn = await builder.account.transferDomain(transferDomain, dvmScript) - const outs = await sendTransaction(container, txn) - const encoded: string = OP_CODES.OP_DEFI_TX_TRANSFER_DOMAIN(transferDomain).asBuffer().toString('hex') - const expectedTransferDomainScript = `6a${encoded}` - - expect(outs.length).toStrictEqual(2) - expect(outs[0].value).toStrictEqual(0) - expect(outs[0].n).toStrictEqual(0) - expect(outs[0].tokenId).toStrictEqual(0) - expect(outs[0].scriptPubKey.asm.startsWith('OP_RETURN 4466547838')).toStrictEqual(true) - expect(outs[0].scriptPubKey.hex).toStrictEqual(expectedTransferDomainScript) - expect(outs[0].scriptPubKey.type).toStrictEqual('nulldata') - - expect(outs[1].value).toEqual(expect.any(Number)) - expect(outs[1].n).toStrictEqual(1) - expect(outs[1].tokenId).toStrictEqual(0) - expect(outs[1].scriptPubKey.type).toStrictEqual('witness_v0_keyhash') - expect(outs[1].scriptPubKey.addresses[0]).toStrictEqual(dvmAddr) - - const dvmAccAfter = await testing.rpc.account.getAccount(dvmAddr) - const [dvmBalanceAfter0, tokenIdAfter0] = dvmAccAfter[0].split('@') - expect(tokenIdBefore0).toStrictEqual(tokenIdAfter0) - - // check: dvm balance is transferred - expect(new BigNumber(dvmBalanceAfter0)) - .toStrictEqual(new BigNumber(dvmBalanceBefore0).plus(3 - 4)) - - // check: evm balance = dvm balance - transferred - const withoutEthRes = await testing.rpc.account.getTokenBalances({}, false) - const [withoutEth] = withoutEthRes[0].split('@') - - const withEthRes = await testing.rpc.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) - const [withEth] = withEthRes[0].split('@') - expect(new BigNumber(withoutEth).plus(4)).toStrictEqual(new BigNumber(withEth)) + const promise = sendTransaction(testing.container, txn) + await expect(promise).rejects.toThrow(DeFiDRpcError) + await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') }) }) + +async function getEVMBalances (testing: Testing): Promise { + const withoutEthRes = await testing.rpc.account.getTokenBalances({}, false) + const [withoutEth] = withoutEthRes[0].split('@') + const withEthRes = await testing.rpc.account.getTokenBalances({}, false, { symbolLookup: false, includeEth: true }) + const [withEth] = withEthRes[0].split('@') + return new BigNumber(withEth).minus(withoutEth) +} From 781427d33f698e7ab68bd4fd95001b35afcdc8fd Mon Sep 17 00:00:00 2001 From: Harsh Date: Tue, 8 Aug 2023 10:45:31 +0530 Subject: [PATCH 03/23] enabled evm-dvm --- apps/playground-api/src/setups/setup.gov.ts | 1 + .../__tests__/category/account/getTokenBalances.test.ts | 1 + .../__tests__/category/account/transferDomain.test.ts | 1 + packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts | 1 + .../__tests__/txn/txn_builder_account_transfer_domain.test.ts | 1 + 5 files changed, 5 insertions(+) diff --git a/apps/playground-api/src/setups/setup.gov.ts b/apps/playground-api/src/setups/setup.gov.ts index 8ae4f817ef..935087194b 100644 --- a/apps/playground-api/src/setups/setup.gov.ts +++ b/apps/playground-api/src/setups/setup.gov.ts @@ -158,6 +158,7 @@ export class SetupGov extends PlaygroundSetup> { 'v0/params/feature/evm': 'true', 'v0/params/feature/transferdomain': 'true', 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/evm-dvm/enabled': 'true', 'v0/transferdomain/dvm-evm/dat-enabled': 'true', 'v0/transferdomain/evm-dvm/dat-enabled': 'true' } diff --git a/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts b/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts index 510b1045e5..adc52f6cca 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts @@ -107,6 +107,7 @@ describe('Account', () => { 'v0/params/feature/evm': 'true', 'v0/params/feature/transferdomain': 'true', 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/evm-dvm/enabled': 'true', 'v0/transferdomain/dvm-evm/dat-enabled': 'true', 'v0/transferdomain/evm-dvm/dat-enabled': 'true' } diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index 47d225deaa..c5419c24ac 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -18,6 +18,7 @@ describe('TransferDomain', () => { 'v0/params/feature/evm': 'true', 'v0/params/feature/transferdomain': 'true', 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/evm-dvm/enabled': 'true', 'v0/transferdomain/dvm-evm/dat-enabled': 'true', 'v0/transferdomain/evm-dvm/dat-enabled': 'true' } diff --git a/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts b/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts index 30ddb16e4d..80743ce66c 100644 --- a/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts @@ -28,6 +28,7 @@ describe('EVMTX', () => { 'v0/params/feature/evm': 'true', 'v0/params/feature/transferdomain': 'true', 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/evm-dvm/enabled': 'true', 'v0/transferdomain/dvm-evm/dat-enabled': 'true', 'v0/transferdomain/evm-dvm/dat-enabled': 'true' } diff --git a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts index 58d64bc1d4..12a16c0e8d 100644 --- a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts +++ b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts @@ -38,6 +38,7 @@ describe('transferDomain', () => { 'v0/params/feature/evm': 'true', 'v0/params/feature/transferdomain': 'true', 'v0/transferdomain/dvm-evm/enabled': 'true', + 'v0/transferdomain/evm-dvm/enabled': 'true', 'v0/transferdomain/dvm-evm/dat-enabled': 'true', 'v0/transferdomain/evm-dvm/dat-enabled': 'true' } From 44e228d046e271e8f5a2b7c8c046d91ee22cbadf Mon Sep 17 00:00:00 2001 From: Harsh Date: Tue, 8 Aug 2023 10:48:56 +0530 Subject: [PATCH 04/23] chore --- .../txn/txn_builder_account_transfer_domain.test.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts index 12a16c0e8d..0f31174426 100644 --- a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts +++ b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts @@ -61,17 +61,8 @@ describe('transferDomain', () => { tradeable: true, collateralAddress: dvmAddr }) - await testing.token.create({ - symbol: 'ETH', - name: 'ETH', - isDAT: true, - mintable: true, - tradeable: true, - collateralAddress: dvmAddr - }) await container.generate(1) await testing.token.mint({ amount: '10', symbol: 'BTC' }) - await testing.token.mint({ amount: '10', symbol: 'ETH' }) await testing.generate(1) // Fund 100 DFI UTXO From 12e9bcb1fba6f29e2996894505105d94f1c3a6ee Mon Sep 17 00:00:00 2001 From: Harsh Date: Tue, 8 Aug 2023 11:12:13 +0530 Subject: [PATCH 05/23] updated dfi legacy address for transferdomain --- .../__tests__/category/account/getTokenBalances.test.ts | 2 +- .../jellyfish-api-core/__tests__/category/evm/evmTx.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts b/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts index adc52f6cca..baa15cc015 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/getTokenBalances.test.ts @@ -114,7 +114,7 @@ describe('Account', () => { }) await container.generate(1) - const dvmAddr = await container.call('getnewaddress') + const dvmAddr = await container.getNewAddress('dvm', 'legacy') const evmAddr = await container.getNewAddress('eth', 'eth') await container.call('utxostoaccount', [{ [dvmAddr]: '100@0' }]) diff --git a/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts b/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts index 80743ce66c..d3275cf6be 100644 --- a/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/evm/evmTx.test.ts @@ -34,7 +34,7 @@ describe('EVMTX', () => { } }) await container.generate(1) - dfiAddress = await container.call('getnewaddress') + dfiAddress = await container.call('getnewaddress', ['', 'legacy']) await container.call('utxostoaccount', [{ [dfiAddress]: '105@DFI' }]) await container.generate(1) ethAddress = await container.call('getnewaddress', ['', 'eth']) From 45b23115211c4d1a3874a7627d3d18272e5673b2 Mon Sep 17 00:00:00 2001 From: Harsh Date: Wed, 9 Aug 2023 17:22:16 +0530 Subject: [PATCH 06/23] added testcase for loand and non dtoken --- .../category/account/transferDomain.test.ts | 345 +++++++++++++----- 1 file changed, 258 insertions(+), 87 deletions(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index c5419c24ac..63d2e49d97 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -28,7 +28,7 @@ describe('TransferDomain', () => { dvmAddr = await container.getNewAddress('address1', 'legacy') evmAddr = await container.getNewAddress('eth', 'eth') - await container.call('utxostoaccount', [{ [dvmAddr]: '100@0' }]) + await container.call('utxostoaccount', [{ [dvmAddr]: '100000@0' }]) await container.generate(1) await container.call('createtoken', [{ @@ -47,11 +47,20 @@ describe('TransferDomain', () => { tradeable: true, collateralAddress: dvmAddr }]) + await container.call('createtoken', [{ + name: 'DESC', + symbol: 'DESC', + isDAT: false, + mintable: true, + tradeable: true, + collateralAddress: dvmAddr + }]) await container.generate(1) - await container.call('minttokens', ['10@BTC']) await container.call('minttokens', ['10@ETH']) + await container.call('minttokens', ['10@DESC#128']) await container.generate(1) + await createLoanToken(container, dvmAddr) }) afterAll(async () => { @@ -235,18 +244,18 @@ describe('TransferDomain', () => { { src: { address: dvmAddr, - amount: '999@DFI', + amount: '999999@DFI', domain: TransferDomainType.DVM }, dst: { address: evmAddr, - amount: '999@DFI', + amount: '999999@DFI', domain: TransferDomainType.EVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('amount 100.00000000 is less than 999.00000000') + await expect(promise).rejects.toThrow('amount 90000.00000000 is less than 999999.00000000') }) it('(evm -> dvm) should fail if insufficient balance', async () => { @@ -305,11 +314,136 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow(RpcApiError) await expect(promise).rejects.toThrow('Amount out of range') }) + + it('should not transfer if custom (isDAT = false) token is transferred', async () => { + const dvmAcc = await getAccountValues(client, dvmAddr) + const tokenId = 'DESC#128' + const dvmBalance0 = dvmAcc[tokenId] + + const txid = await client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@DESC#128', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '3@DESC#128', + domain: TransferDomainType.EVM + } + } + ]) + expect(typeof txid).toStrictEqual('string') + expect(txid.length).toStrictEqual(64) + await container.generate(1) + + const dvmAcc1 = await getAccountValues(client, dvmAddr) + const dvmBalance1 = dvmAcc1[tokenId] + + // check: dvm balance is not transferred + expect(new BigNumber(dvmBalance0)) + .toStrictEqual(new BigNumber(dvmBalance1)) + }) + + it('should not transfer if loan token is transferred', async () => { + const dvmAcc = await getAccountValues(client, dvmAddr) + const tokenId = 'DESC#128' + const dvmBalance0 = dvmAcc[tokenId] + + const txid = await client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@AAPL', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '3@AAPL', + domain: TransferDomainType.EVM + } + } + ]) + expect(typeof txid).toStrictEqual('string') + expect(txid.length).toStrictEqual(64) + await container.generate(1) + + const dvmAcc1 = await getAccountValues(client, dvmAddr) + const dvmBalance1 = dvmAcc1[tokenId] + + // check: dvm balance is not transferred + expect(new BigNumber(dvmBalance0)) + .toStrictEqual(new BigNumber(dvmBalance1)) + }) + + it('should fail (duo) Transfer Domain from DVM to EVM', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '1@DFI', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '1@DFI', + domain: TransferDomainType.EVM + } + }, + { + src: { + address: dvmAddr, + amount: '1@DFI', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '1@DFI', + domain: TransferDomainType.EVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') + }) + + it('should fail (duo) Transfer Domain from EVM to DVM', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: evmAddr, + amount: '3@DFI', + domain: TransferDomainType.EVM + }, + dst: { + address: dvmAddr, + amount: '3@DFI', + domain: TransferDomainType.DVM + } + }, + { + src: { + address: evmAddr, + amount: '4@DFI', + domain: TransferDomainType.EVM + }, + dst: { + address: dvmAddr, + amount: '4@DFI', + domain: TransferDomainType.DVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') + }) }) it('should Transfer Domain from DVM to EVM', async () => { - const dvmAcc = await client.account.getAccount(dvmAddr) - const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') + const dvmAcc = await getAccountValues(client, dvmAddr) + const tokenId = 'DFI' + const dvmBalance0 = dvmAcc[tokenId] const prevBalance = await getEVMBalances(client) const txid = await client.account.transferDomain([ @@ -330,9 +464,8 @@ describe('TransferDomain', () => { expect(txid.length).toStrictEqual(64) await container.generate(1) - const dvmAcc1 = await client.account.getAccount(dvmAddr) - const [dvmBalance1, tokenId1] = dvmAcc1[0].split('@') - expect(tokenId1).toStrictEqual(tokenId0) + const dvmAcc1 = await getAccountValues(client, dvmAddr) + const dvmBalance1 = dvmAcc1[tokenId] // check: dvm balance is transferred expect(new BigNumber(dvmBalance0)) @@ -345,9 +478,11 @@ describe('TransferDomain', () => { }) it('should Transfer Domain dToken from DVM to EVM', async () => { - const dvmAcc = (await client.account.getAccount(dvmAddr)) - const [btcBalance, btcTokenId] = dvmAcc[1]?.split('@') - const [ethBalance, ethTokenId] = dvmAcc[2].split('@') + const dvmAcc = await getAccountValues(client, dvmAddr) + const btcTokenId = 'BTC' + const ethTokenId = 'ETH' + const btcBalance = dvmAcc[btcTokenId] + const ethBalance = dvmAcc[ethTokenId] const txid1 = await client.account.transferDomain([ { src: { @@ -396,24 +531,22 @@ describe('TransferDomain', () => { expect(txid2.length).toStrictEqual(64) await container.generate(1) - const dvmAcc1 = await client.account.getAccount(dvmAddr) - - const [btcBalance1, btcTokenId1] = dvmAcc1[1]?.split('@') - const [ethBalance1, ethTokenId1] = dvmAcc1[2].split('@') - expect(btcTokenId).toStrictEqual(btcTokenId1) - expect(ethTokenId).toStrictEqual(ethTokenId1) + const dvmAcc1 = await getAccountValues(client, dvmAddr) + const btcBalance1 = dvmAcc1[btcTokenId] + const ethBalance1 = dvmAcc1[ethTokenId] // check: BTC balance is transferred expect(new BigNumber(btcBalance1)) .toStrictEqual(new BigNumber(btcBalance).minus(3)) - // check: ETH balance is transferred + // check: ETH balance is transferred expect(new BigNumber(ethBalance1)) .toStrictEqual(new BigNumber(ethBalance).minus(3)) }) it('should Transfer Domain from EVM to DVM', async () => { - const dvmAcc = await client.account.getAccount(dvmAddr) - const [dvmBalance0, tokenId0] = dvmAcc[0].split('@') + const dvmAcc = await getAccountValues(client, dvmAddr) + const tokenId = 'DFI' + const dvmBalance0 = dvmAcc[tokenId] const prevBalance = await getEVMBalances(client) const txid = await client.account.transferDomain([ { @@ -434,9 +567,8 @@ describe('TransferDomain', () => { await container.generate(1) - const dvmAcc1 = await client.account.getAccount(dvmAddr) - const [dvmBalance1, tokenId1] = dvmAcc1[0].split('@') - expect(tokenId1).toStrictEqual(tokenId0) + const dvmAcc1 = await getAccountValues(client, dvmAddr) + const dvmBalance1 = dvmAcc1[tokenId] expect(new BigNumber(dvmBalance0)) .toStrictEqual(new BigNumber(dvmBalance1).minus(3)) @@ -445,68 +577,6 @@ describe('TransferDomain', () => { expect(new BigNumber(prevBalance)) .toStrictEqual(new BigNumber(currentBalance).plus(3)) }) - - it('should fail (duo) Transfer Domain from DVM to EVM', async () => { - const promise = client.account.transferDomain([ - { - src: { - address: dvmAddr, - amount: '1@DFI', - domain: TransferDomainType.DVM - }, - dst: { - address: evmAddr, - amount: '1@DFI', - domain: TransferDomainType.EVM - } - }, - { - src: { - address: dvmAddr, - amount: '1@DFI', - domain: TransferDomainType.DVM - }, - dst: { - address: evmAddr, - amount: '1@DFI', - domain: TransferDomainType.EVM - } - } - ]) - await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') - }) - - it('should fail (duo) Transfer Domain from EVM to DVM', async () => { - const promise = client.account.transferDomain([ - { - src: { - address: evmAddr, - amount: '3@DFI', - domain: TransferDomainType.EVM - }, - dst: { - address: dvmAddr, - amount: '3@DFI', - domain: TransferDomainType.DVM - } - }, - { - src: { - address: evmAddr, - amount: '4@DFI', - domain: TransferDomainType.EVM - }, - dst: { - address: dvmAddr, - amount: '4@DFI', - domain: TransferDomainType.DVM - } - } - ]) - await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') - }) }) async function getEVMBalances (client: ContainerAdapterClient): Promise { @@ -516,3 +586,104 @@ async function getEVMBalances (client: ContainerAdapterClient): Promise { + let vaultId + { // Oracle setup + const priceFeeds = [ + { token: 'DFI', currency: 'USD' }, + { token: 'AAPL', currency: 'USD' } + ] + const oracleId1 = await container.call('appointoracle', [address, priceFeeds, 1]) + await container.generate(1) + const timestamp1 = Math.floor(new Date().getTime() / 1000) + await container.call('setoracledata', [oracleId1, timestamp1, [ + { tokenAmount: '1@DFI', currency: 'USD' } + ], []]) + await container.call('setoracledata', [oracleId1, timestamp1, [ + { tokenAmount: '1@AAPL', currency: 'USD' } + ], []]) + await container.generate(1) + + const oracleId2 = await container.call('appointoracle', [address, priceFeeds, 1]) + await container.generate(1) + + const timestamp2 = Math.floor(new Date().getTime() / 1000) + await container.call('setoracledata', [oracleId2, timestamp2, [ + { tokenAmount: '1@DFI', currency: 'USD' } + ], []]) + await container.call('setoracledata', [oracleId2, timestamp2, [ + { tokenAmount: '1@AAPL', currency: 'USD' } + ], []]) + await container.generate(1) + + const oracleId3 = await container.call('appointoracle', [address, priceFeeds, 1]) + await container.generate(1) + + const timestamp3 = Math.floor(new Date().getTime() / 1000) + await container.call('setoracledata', [oracleId3, timestamp3, [ + { tokenAmount: '1@DFI', currency: 'USD' } + ], []]) + await container.call('setoracledata', [oracleId3, timestamp3, [ + { tokenAmount: '1@AAPL', currency: 'USD' } + ], []]) + await container.generate(1) + } + + { // Loan Scheme + await container.call('createloanscheme', [100, 1, 'default']) + await container.generate(1) + } + + { // Collateral Tokens + const blockCount = await container.getBlockCount() + await container.call('setcollateraltoken', [{ + token: 'DFI', + factor: new BigNumber(1), + fixedIntervalPriceId: 'DFI/USD', + activateAfterBlock: blockCount + 1 + }]) + await container.generate(30) + } + + { // Loan Tokens + await container.call('setloantoken', [{ + symbol: 'AAPL', + name: 'APPLE', + fixedIntervalPriceId: 'AAPL/USD', + mintable: true, + interest: new BigNumber(0.01) + }]) + + await container.generate(1) + } + + { // Vault Empty + vaultId = await container.call('createvault', [address, 'default']) + await container.generate(1) + } + + { // Vault Deposit Collateral + await container.call('deposittovault', [vaultId, address, '10000@DFI']) + await container.generate(1) + } + + { // Take Loan + await container.call('takeloan', [{ + vaultId: vaultId, + amounts: '30@AAPL' + }]) + await container.generate(1) + } +} + +async function getAccountValues (client: ContainerAdapterClient, address: string): Promise<{[symbol: string]: string}> { + const values = await client.account.getAccount(address) + return values.reduce((res: {[symbol: string]: string}, current: string) => { + const [value, symbol] = current.split('@') + return { + ...res, + [symbol]: value + } + }, {}) +} From f446d4b4613c5ea8c28813704685ab19da765505 Mon Sep 17 00:00:00 2001 From: Harsh Date: Fri, 11 Aug 2023 15:51:16 +0530 Subject: [PATCH 07/23] updated dfid binary --- .../category/account/transferDomain.test.ts | 18 ++----- ...xn_builder_account_transfer_domain.test.ts | 54 +++++++++++++++++-- .../src/containers/DeFiDContainer.ts | 2 +- .../src/containers/NativeChainContainer.ts | 2 +- 4 files changed, 55 insertions(+), 21 deletions(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index 63d2e49d97..8773a1ecc1 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -316,11 +316,7 @@ describe('TransferDomain', () => { }) it('should not transfer if custom (isDAT = false) token is transferred', async () => { - const dvmAcc = await getAccountValues(client, dvmAddr) - const tokenId = 'DESC#128' - const dvmBalance0 = dvmAcc[tokenId] - - const txid = await client.account.transferDomain([ + const promise = client.account.transferDomain([ { src: { address: dvmAddr, @@ -334,16 +330,8 @@ describe('TransferDomain', () => { } } ]) - expect(typeof txid).toStrictEqual('string') - expect(txid.length).toStrictEqual(64) - await container.generate(1) - - const dvmAcc1 = await getAccountValues(client, dvmAddr) - const dvmBalance1 = dvmAcc1[tokenId] - - // check: dvm balance is not transferred - expect(new BigNumber(dvmBalance0)) - .toStrictEqual(new BigNumber(dvmBalance1)) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Non-DAT or LP tokens are not supported for transferdomain') }) it('should not transfer if loan token is transferred', async () => { diff --git a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts index 0f31174426..2bb974c68f 100644 --- a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts +++ b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts @@ -61,8 +61,23 @@ describe('transferDomain', () => { tradeable: true, collateralAddress: dvmAddr }) + + const txId = await testing.rpc.wallet.sendToAddress(dvmAddr, 20100) + const utxos = [{ + txid: txId, + vout: 0 + }] + await testing.rpc.token.createToken({ + collateralAddress: dvmAddr, + isDAT: false, + mintable: true, + name: 'DESC', + symbol: 'DESC', + tradeable: false + }, utxos) await container.generate(1) await testing.token.mint({ amount: '10', symbol: 'BTC' }) + await testing.token.mint({ amount: '10', symbol: 'DESC#128' }) await testing.generate(1) // Fund 100 DFI UTXO @@ -78,10 +93,10 @@ describe('transferDomain', () => { }) afterAll(async () => { - await testing.container.stop() + // await testing.container.stop() }) - describe('transferDomain failed', () => { + describe.only('transferDomain failed', () => { it('should fail if transfer within same domain', async () => { const transferDomain: TransferDomain = { items: [{ @@ -293,6 +308,37 @@ describe('transferDomain', () => { await expect(promise).rejects.toThrow(DeFiDRpcError) await expect(promise).rejects.toThrow('DeFiDRpcError: \'TransferDomainTx: tx must have at least one input from account owner (code 16)') }) + + it.only('should not transfer if custom (isDAT = false) token is transferred', async () => { + const invalidDvmScript = P2WPKH.fromAddress(RegTest, await testing.container.getNewAddress(), P2WPKH).getScript() + const transferDomain: TransferDomain = { + items: [{ + src: + { + address: dvmScript, + amount: { + token: 128, // <- DESC + amount: new BigNumber(3) + }, + domain: TRANSFER_DOMAIN_TYPE.DVM + }, + dst: { + address: evmScript, + amount: { + token: 128, // <- DESC + amount: new BigNumber(3) + }, + domain: TRANSFER_DOMAIN_TYPE.EVM + } + }] + } + + const txn = await builder.account.transferDomain(transferDomain, invalidDvmScript) + const promise = sendTransaction(testing.container, txn) + + await expect(promise).rejects.toThrow(DeFiDRpcError) + await expect(promise).rejects.toThrow('Non-DAT or LP tokens are not supported for transferdomain') + }) }) it('should transfer domain from DVM to EVM', async () => { @@ -409,7 +455,7 @@ describe('transferDomain', () => { const [dvmBalanceAfter0, tokenIdAfter0] = dvmAccAfter[0].split('@') expect(tokenIdBefore0).toStrictEqual(tokenIdAfter0) - // check: dev balance is updated + // check: dvm balance is updated expect(new BigNumber(dvmBalanceAfter0)) .toStrictEqual(new BigNumber(dvmBalanceBefore0).plus(3)) @@ -524,7 +570,7 @@ describe('transferDomain', () => { const [dvmBalanceAfter0, tokenIdAfter0] = dvmAccAfter[1].split('@') expect(tokenIdBefore0).toStrictEqual(tokenIdAfter0) - // check: dev balance is updated + // check: dvm balance is updated expect(new BigNumber(dvmBalanceAfter0)) .toStrictEqual(new BigNumber(dvmBalanceBefore0).plus(3)) }) diff --git a/packages/testcontainers/src/containers/DeFiDContainer.ts b/packages/testcontainers/src/containers/DeFiDContainer.ts index 50c54f29af..8fd8d5ab29 100644 --- a/packages/testcontainers/src/containers/DeFiDContainer.ts +++ b/packages/testcontainers/src/containers/DeFiDContainer.ts @@ -36,7 +36,7 @@ export abstract class DeFiDContainer extends DockerContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:4.0.0-beta8' // renovate.json regexManagers + return 'defi/defichain:HEAD-8ec61a247' // renovate.json regexManagers } public static readonly DefaultStartOptions = { diff --git a/packages/testcontainers/src/containers/NativeChainContainer.ts b/packages/testcontainers/src/containers/NativeChainContainer.ts index c5d7200fe8..e2944cb12e 100644 --- a/packages/testcontainers/src/containers/NativeChainContainer.ts +++ b/packages/testcontainers/src/containers/NativeChainContainer.ts @@ -29,7 +29,7 @@ export class NativeChainContainer extends GenericContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:4.0.0-beta8' // renovate.json regexManagers + return 'defi/defichain:HEAD-8ec61a247' // renovate.json regexManagers } public static readonly PREFIX = 'defichain-testcontainers-' From fe6fe1f3bf0f99af64dda706b58acd863d553070 Mon Sep 17 00:00:00 2001 From: pierregee Date: Fri, 18 Aug 2023 14:23:13 +0800 Subject: [PATCH 08/23] update all test cases --- .../category/account/transferDomain.test.ts | 478 ++++++++++++++---- .../src/containers/DeFiDContainer.ts | 2 +- .../src/containers/NativeChainContainer.ts | 2 +- 3 files changed, 371 insertions(+), 111 deletions(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index 8773a1ecc1..5926384a3b 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -68,64 +68,83 @@ describe('TransferDomain', () => { }) describe('transferDomain failed', () => { - it('should fail if transfer within same domain', async () => { + it('(dvm -> evm) should fail if src address is invalid', async () => { const promise = client.account.transferDomain([ { src: { - address: dvmAddr, + address: 'invalid', // invalid amount: '3@DFI', domain: TransferDomainType.DVM }, dst: { - address: dvmAddr, + address: evmAddr, amount: '3@DFI', - domain: TransferDomainType.DVM + domain: TransferDomainType.EVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Cannot transfer inside same domain') + await expect(promise).rejects.toThrow('recipient (invalid) does not refer to any valid address') }) - it('should fail if amount is different', async () => { + it('(dvm -> evm) should fail if dst address is invalid', async () => { const promise = client.account.transferDomain([ { src: { address: dvmAddr, - amount: '3@DFI', // diff + amount: '3@DFI', domain: TransferDomainType.DVM }, dst: { - address: dvmAddr, - amount: '46@DFI', // diff + address: 'invalid', // invalid + amount: '3@DFI', domain: TransferDomainType.EVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Source amount must be equal to destination amount') + await expect(promise).rejects.toThrow('recipient (invalid) does not refer to any valid address') }) - it('should fail if transfer diff src and dst token', async () => { + it('(evm -> dvm) should fail if src address is invalid', async () => { const promise = client.account.transferDomain([ { src: { - address: dvmAddr, + address: evmAddr, amount: '3@DFI', - domain: TransferDomainType.DVM + domain: TransferDomainType.EVM }, dst: { - address: dvmAddr, - amount: '3@BTC', + address: 'invalid', // invalid + amount: '3@DFI', + domain: TransferDomainType.DVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('recipient (invalid) does not refer to any valid address') + }) + + it('(evm -> dvm) should fail if dst address is invalid', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: evmAddr, + amount: '3@DFI', domain: TransferDomainType.EVM + }, + dst: { + address: 'invalid', // invalid + amount: '3@DFI', + domain: TransferDomainType.DVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Source token and destination token must be the same') + await expect(promise).rejects.toThrow('recipient (invalid) does not refer to any valid address') }) - it('(dvm -> evm) should fail if source address and source domain are not match', async () => { + it('(dvm -> evm) should fail if src address is not legacy or Bech32 address in case of "DVM" domain', async () => { const promise = client.account.transferDomain([ { src: { @@ -144,26 +163,26 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow('Src address must be a legacy or Bech32 address in case of "DVM" domain') }) - it('(evm -> dvm) should fail if source address and source domain are not match', async () => { + it('(evm -> dvm) should fail if dst address is not legacy or Bech32 address in case of "DVM domain', async () => { const promise = client.account.transferDomain([ { src: { - address: dvmAddr, // <- not match + address: evmAddr, amount: '3@DFI', - domain: TransferDomainType.EVM // <- not match + domain: TransferDomainType.EVM }, dst: { - address: dvmAddr, + address: evmAddr, // <- not match amount: '3@DFI', - domain: TransferDomainType.DVM + domain: TransferDomainType.DVM // <- not match } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Src address must be an ERC55 address in case of "EVM" domain') + await expect(promise).rejects.toThrow('Dst address must be a legacy or Bech32 address in case of "DVM" domain') }) - it('(dvm -> evm) should fail if destination address and destination domain are not match', async () => { + it('(dvm -> evm) should fail if dst address is not ERC55 address in case of "EVM" domain', async () => { const promise = client.account.transferDomain([ { src: { @@ -175,6 +194,7 @@ describe('TransferDomain', () => { address: dvmAddr, // <- not match amount: '3@DFI', domain: TransferDomainType.EVM // <- not match + } } ]) @@ -182,99 +202,137 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow('Dst address must be an ERC55 address in case of "EVM" domain') }) - it('(evm -> dvm) should fail if destination address and destination domain are not match', async () => { + it('(evm -> dvm) should fail if src address is not ERC55 address in case of "EVM" domain', async () => { const promise = client.account.transferDomain([ { src: { - address: evmAddr, + address: dvmAddr, // <- not match amount: '3@DFI', - domain: TransferDomainType.EVM + domain: TransferDomainType.EVM // <- not match }, dst: { - address: evmAddr, // <- not match + address: dvmAddr, amount: '3@DFI', - domain: TransferDomainType.DVM // <- not match + domain: TransferDomainType.DVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Dst address must be a legacy or Bech32 address in case of "DVM" domain') + await expect(promise).rejects.toThrow('Src address must be an ERC55 address in case of "EVM" domain') }) - it('(dvm -> evm) should fail if address is invalid', async () => { + it('(dvm -> evm) should fail if amount value is invalid', async () => { const promise = client.account.transferDomain([ { src: { - address: 'invalid', - amount: '3@DFI', + address: dvmAddr, + amount: 'invalid@DFI', // invalid amount domain: TransferDomainType.DVM }, dst: { address: evmAddr, - amount: '3@DFI', + amount: 'invalid@DFI', // invalid amount domain: TransferDomainType.EVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('recipient (invalid) does not refer to any valid address') + await expect(promise).rejects.toThrow('Invalid amount') }) - it('(evm -> dvm) should fail if address is invalid', async () => { + it('(evm -> dvm) should fail if amount value is invalid', async () => { const promise = client.account.transferDomain([ { src: { address: evmAddr, - amount: '3@DFI', + amount: 'invalid@DFI', // invalid amount domain: TransferDomainType.EVM }, dst: { - address: 'invalid', - amount: '3@DFI', + address: dvmAddr, + amount: 'invalid@DFI', // invalid amount domain: TransferDomainType.DVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('recipient (invalid) does not refer to any valid address') + await expect(promise).rejects.toThrow('Invalid amount') }) - it('(dvm -> evm) should fail if insufficient balance', async () => { + it('(dvm -> evm) should fail if amount symbol is different', async () => { const promise = client.account.transferDomain([ { src: { address: dvmAddr, - amount: '999999@DFI', + amount: '3@DFI', // not match domain: TransferDomainType.DVM }, dst: { address: evmAddr, - amount: '999999@DFI', + amount: '3@BTC', // not match domain: TransferDomainType.EVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('amount 90000.00000000 is less than 999999.00000000') + await expect(promise).rejects.toThrow('Source token and destination token must be the same') }) - it('(evm -> dvm) should fail if insufficient balance', async () => { + it('(evm -> dvm) should fail if amount symbol is different', async () => { const promise = client.account.transferDomain([ { src: { address: evmAddr, - amount: '999@DFI', + amount: '3@DFI', // not match domain: TransferDomainType.EVM }, dst: { address: dvmAddr, - amount: '999@DFI', + amount: '3@BTC', // not match domain: TransferDomainType.DVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow(`Not enough balance in ${evmAddr} to cover "EVM" domain transfer`) + await expect(promise).rejects.toThrow('Source token and destination token must be the same') + }) + + it('(dvm -> evm) should fail if amount value is different', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '2@DFI', // not match + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '3@DFI', // not match + domain: TransferDomainType.EVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Source amount must be equal to destination amount') + }) + + it('(evm -> dvm) should fail if amount value is different', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: evmAddr, + amount: '2@DFI', // not match + domain: TransferDomainType.EVM + }, + dst: { + address: dvmAddr, + amount: '3@BTC', // not match + domain: TransferDomainType.DVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Source amount must be equal to destination amount') }) it('(dvm -> evm) should fail if negative amount', async () => { @@ -282,12 +340,12 @@ describe('TransferDomain', () => { { src: { address: dvmAddr, - amount: '-1@DFI', + amount: '-1@DFI', // invalid domain: TransferDomainType.DVM }, dst: { address: evmAddr, - amount: '-1@DFI', + amount: '-1@DFI', // invalid domain: TransferDomainType.EVM } } @@ -301,12 +359,12 @@ describe('TransferDomain', () => { { src: { address: evmAddr, - amount: '-1@DFI', + amount: '-1@DFI', // invalid domain: TransferDomainType.EVM }, dst: { address: dvmAddr, - amount: '-1@DFI', + amount: '-1@DFI', // invalid domain: TransferDomainType.DVM } } @@ -315,57 +373,199 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow('Amount out of range') }) - it('should not transfer if custom (isDAT = false) token is transferred', async () => { + it('(dvm -> evm) should fail if src domain is invalid', async () => { const promise = client.account.transferDomain([ { src: { address: dvmAddr, - amount: '3@DESC#128', + amount: '3@DFI', + domain: 1 // invalid + }, + dst: { + address: evmAddr, + amount: '3@BTC', + domain: TransferDomainType.EVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Invalid parameters, src argument "domain" must be either 2 (DFI token to EVM) or 3 (EVM to DFI token)') + }) + + it('(dvm -> evm) should fail if dst domain is invalid', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@DFI', domain: TransferDomainType.DVM + }, dst: { address: evmAddr, - amount: '3@DESC#128', + amount: '3@DFI', + domain: 1 // invalid + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Unknown transfer domain aspect') + }) + + it('(dvm -> evm) should fail if src domain is invalid', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@DFI', + domain: 1 // invalid + }, + dst: { + address: evmAddr, + amount: '3@BTC', domain: TransferDomainType.EVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Non-DAT or LP tokens are not supported for transferdomain') + await expect(promise).rejects.toThrow('Invalid parameters, src argument "domain" must be either 2 (DFI token to EVM) or 3 (EVM to DFI token)') + }) + + it('(evm -> dvm) should fail if dst domain is invalid', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@DFI', + domain: TransferDomainType.EVM + + }, + dst: { + address: evmAddr, + amount: '3@BTC', + domain: 1 // invalid + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Source token and destination token must be the same') + }) + + it('(dvm -> dvm) should fail if transfer within same domain', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@DFI', + domain: TransferDomainType.DVM // same domain + }, + dst: { + address: dvmAddr, + amount: '3@DFI', + domain: TransferDomainType.DVM // same domain + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Cannot transfer inside same domain') }) - it('should not transfer if loan token is transferred', async () => { - const dvmAcc = await getAccountValues(client, dvmAddr) - const tokenId = 'DESC#128' - const dvmBalance0 = dvmAcc[tokenId] + it('(evm -> evm) should fail if transfer within same domain', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: evmAddr, + amount: '3@DFI', + domain: TransferDomainType.EVM // same domain + }, + dst: { + address: evmAddr, + amount: '3@DFI', + domain: TransferDomainType.EVM // same domain + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Cannot transfer inside same domain') + }) - const txid = await client.account.transferDomain([ + it('(dvm -> evm) should fail if insufficient balance', async () => { + const promise = client.account.transferDomain([ { src: { address: dvmAddr, - amount: '3@AAPL', + amount: '999999@DFI', domain: TransferDomainType.DVM }, dst: { address: evmAddr, - amount: '3@AAPL', + amount: '999999@DFI', domain: TransferDomainType.EVM } } ]) - expect(typeof txid).toStrictEqual('string') - expect(txid.length).toStrictEqual(64) - await container.generate(1) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('amount 90000.00000000 is less than 999999.00000000') + }) - const dvmAcc1 = await getAccountValues(client, dvmAddr) - const dvmBalance1 = dvmAcc1[tokenId] + it('(evm -> dvm) should fail if insufficient balance', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: evmAddr, + amount: '999@DFI', + domain: TransferDomainType.EVM + }, + dst: { + address: dvmAddr, + amount: '999@DFI', + domain: TransferDomainType.DVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow(`Not enough balance in ${evmAddr} to cover "EVM" domain transfer`) + }) - // check: dvm balance is not transferred - expect(new BigNumber(dvmBalance0)) - .toStrictEqual(new BigNumber(dvmBalance1)) + it('(dvm -> evm) should fail if custom (isDAT = false) token is transferred', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '3@DESC#128', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '3@DESC#128', + domain: TransferDomainType.EVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Non-DAT or LP tokens are not supported for transferdomain') }) - it('should fail (duo) Transfer Domain from DVM to EVM', async () => { + it('(evm -> dvm) should fail if custom (isDAT = false) token is transferred', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: evmAddr, + amount: '3@DESC#128', + domain: TransferDomainType.EVM + }, + dst: { + address: dvmAddr, + amount: '3@DESC#128', + domain: TransferDomainType.DVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow('Non-DAT or LP tokens are not supported for transferdomain') + }) + + it('(dvm -> evm) should fail if (duo) transfer domain', async () => { const promise = client.account.transferDomain([ { src: { @@ -396,7 +596,7 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow('TransferDomain currently only supports a single transfer per transaction') }) - it('should fail (duo) Transfer Domain from EVM to DVM', async () => { + it('(evm -> dvm) should fail if (duo) transfer domain', async () => { const promise = client.account.transferDomain([ { src: { @@ -428,7 +628,7 @@ describe('TransferDomain', () => { }) }) - it('should Transfer Domain from DVM to EVM', async () => { + it('(dvm -> evm) should transfer domain - DFI', async () => { const dvmAcc = await getAccountValues(client, dvmAddr) const tokenId = 'DFI' const dvmBalance0 = dvmAcc[tokenId] @@ -465,12 +665,10 @@ describe('TransferDomain', () => { .toStrictEqual(new BigNumber(currentBalance).minus(3)) }) - it('should Transfer Domain dToken from DVM to EVM', async () => { + it('(dvm -> evm) should transfer domain - dToken', async () => { const dvmAcc = await getAccountValues(client, dvmAddr) const btcTokenId = 'BTC' - const ethTokenId = 'ETH' const btcBalance = dvmAcc[btcTokenId] - const ethBalance = dvmAcc[ethTokenId] const txid1 = await client.account.transferDomain([ { src: { @@ -487,83 +685,145 @@ describe('TransferDomain', () => { ]) expect(typeof txid1).toStrictEqual('string') expect(txid1.length).toStrictEqual(64) - const txid2 = await client.account.transferDomain([ + + await container.generate(1) + + const dvmAcc1 = await getAccountValues(client, dvmAddr) + const btcBalance1 = dvmAcc1[btcTokenId] + + // check: BTC balance is transferred + expect(new BigNumber(btcBalance1)) + .toStrictEqual(new BigNumber(btcBalance).minus(3)) + }) + + it('(evm -> dvm) should transfer domain - DFI', async () => { + const dvmAcc = await getAccountValues(client, dvmAddr) + const tokenId = 'DFI' + const dvmBalance0 = dvmAcc[tokenId] + const prevBalance = await getEVMBalances(client) + const txid = await client.account.transferDomain([ { src: { - address: dvmAddr, - amount: '3@ETH', - domain: TransferDomainType.DVM + address: evmAddr, + amount: '3@DFI', + domain: TransferDomainType.EVM }, dst: { + address: dvmAddr, + amount: '3@DFI', + domain: TransferDomainType.DVM + } + } + ]) + expect(typeof txid).toStrictEqual('string') + expect(txid.length).toStrictEqual(64) + + await container.generate(1) + + const dvmAcc1 = await getAccountValues(client, dvmAddr) + const dvmBalance1 = dvmAcc1[tokenId] + expect(new BigNumber(dvmBalance0)) + .toStrictEqual(new BigNumber(dvmBalance1).minus(3)) + + // check EVM balance + const currentBalance = await getEVMBalances(client) + expect(new BigNumber(prevBalance)) + .toStrictEqual(new BigNumber(currentBalance).plus(3)) + }) + + it('(evm -> dvm) should transfer domain - dToken', async () => { + const dvmAcc = await getAccountValues(client, dvmAddr) + const btcTokenId = 'BTC' + const btcBalance = dvmAcc[btcTokenId] + const txid1 = await client.account.transferDomain([ + { + src: { address: evmAddr, - amount: '3@ETH', + amount: '3@BTC', domain: TransferDomainType.EVM + + }, + dst: { + address: dvmAddr, + amount: '3@BTC', + domain: TransferDomainType.DVM } } ]) - await client.account.transferDomain([ + expect(typeof txid1).toStrictEqual('string') + expect(txid1.length).toStrictEqual(64) + + await container.generate(1) + + const dvmAcc1 = await getAccountValues(client, dvmAddr) + const btcBalance1 = dvmAcc1[btcTokenId] + + // check: BTC balance is transferred + expect(new BigNumber(btcBalance1)) + .toStrictEqual(new BigNumber(btcBalance).plus(3)) + }) + + it('(dvm -> evm) should transfer domain - loan token', async () => { + const dvmAcc = await getAccountValues(client, dvmAddr) + const tokenId = 'AAPL' + const dvmBalance0 = dvmAcc[tokenId] + + const txid = await client.account.transferDomain([ { src: { address: dvmAddr, - amount: '3@DFI', + amount: '3@AAPL', domain: TransferDomainType.DVM }, dst: { address: evmAddr, - amount: '3@DFI', + amount: '3@AAPL', domain: TransferDomainType.EVM } } ]) - expect(typeof txid2).toStrictEqual('string') - expect(txid2.length).toStrictEqual(64) + expect(typeof txid).toStrictEqual('string') + expect(txid.length).toStrictEqual(64) await container.generate(1) const dvmAcc1 = await getAccountValues(client, dvmAddr) - const btcBalance1 = dvmAcc1[btcTokenId] - const ethBalance1 = dvmAcc1[ethTokenId] + const dvmBalance1 = dvmAcc1[tokenId] - // check: BTC balance is transferred - expect(new BigNumber(btcBalance1)) - .toStrictEqual(new BigNumber(btcBalance).minus(3)) - // check: ETH balance is transferred - expect(new BigNumber(ethBalance1)) - .toStrictEqual(new BigNumber(ethBalance).minus(3)) + // check dvm balance is transferred + expect(new BigNumber(dvmBalance1)) + .toStrictEqual(new BigNumber(dvmBalance0).minus(3)) }) - it('should Transfer Domain from EVM to DVM', async () => { + it('(evm -> dvm) should transfer domain - loan token', async () => { const dvmAcc = await getAccountValues(client, dvmAddr) - const tokenId = 'DFI' + const tokenId = 'AAPL' const dvmBalance0 = dvmAcc[tokenId] - const prevBalance = await getEVMBalances(client) + const txid = await client.account.transferDomain([ { src: { address: evmAddr, - amount: '3@DFI', + amount: '3@AAPL', domain: TransferDomainType.EVM }, dst: { address: dvmAddr, - amount: '3@DFI', + amount: '3@AAPL', domain: TransferDomainType.DVM + } } ]) expect(typeof txid).toStrictEqual('string') expect(txid.length).toStrictEqual(64) - await container.generate(1) const dvmAcc1 = await getAccountValues(client, dvmAddr) const dvmBalance1 = dvmAcc1[tokenId] - expect(new BigNumber(dvmBalance0)) - .toStrictEqual(new BigNumber(dvmBalance1).minus(3)) - // check EVM balance - const currentBalance = await getEVMBalances(client) - expect(new BigNumber(prevBalance)) - .toStrictEqual(new BigNumber(currentBalance).plus(3)) + // check dvm balance is received + expect(new BigNumber(dvmBalance1)) + .toStrictEqual(new BigNumber(dvmBalance0).plus(3)) }) }) @@ -665,9 +925,9 @@ async function createLoanToken (container: MasterNodeRegTestContainer, address: } } -async function getAccountValues (client: ContainerAdapterClient, address: string): Promise<{[symbol: string]: string}> { +async function getAccountValues (client: ContainerAdapterClient, address: string): Promise<{ [symbol: string]: string }> { const values = await client.account.getAccount(address) - return values.reduce((res: {[symbol: string]: string}, current: string) => { + return values.reduce((res: { [symbol: string]: string }, current: string) => { const [value, symbol] = current.split('@') return { ...res, diff --git a/packages/testcontainers/src/containers/DeFiDContainer.ts b/packages/testcontainers/src/containers/DeFiDContainer.ts index 8fd8d5ab29..379e4461f8 100644 --- a/packages/testcontainers/src/containers/DeFiDContainer.ts +++ b/packages/testcontainers/src/containers/DeFiDContainer.ts @@ -36,7 +36,7 @@ export abstract class DeFiDContainer extends DockerContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:HEAD-8ec61a247' // renovate.json regexManagers + return 'defi/defichain:HEAD-3d8ca2de7' // renovate.json regexManagers } public static readonly DefaultStartOptions = { diff --git a/packages/testcontainers/src/containers/NativeChainContainer.ts b/packages/testcontainers/src/containers/NativeChainContainer.ts index e2944cb12e..f5b2ab7e31 100644 --- a/packages/testcontainers/src/containers/NativeChainContainer.ts +++ b/packages/testcontainers/src/containers/NativeChainContainer.ts @@ -29,7 +29,7 @@ export class NativeChainContainer extends GenericContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:HEAD-8ec61a247' // renovate.json regexManagers + return 'defi/defichain:HEAD-3d8ca2de7' // renovate.json regexManagers } public static readonly PREFIX = 'defichain-testcontainers-' From ac740d1fe0c0f9a7b8909a38407156bf02cfe94d Mon Sep 17 00:00:00 2001 From: pierregee Date: Fri, 18 Aug 2023 14:35:30 +0800 Subject: [PATCH 09/23] update invalid domain test cases --- .../category/account/transferDomain.test.ts | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index 5926384a3b..afe90cc8df 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -373,82 +373,82 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow('Amount out of range') }) - it('(dvm -> evm) should fail if src domain is invalid', async () => { + it('(dvm -> invalid) should fail if dst domain is invalid', async () => { const promise = client.account.transferDomain([ { src: { address: dvmAddr, amount: '3@DFI', - domain: 1 // invalid + domain: TransferDomainType.DVM + }, dst: { address: evmAddr, - amount: '3@BTC', - domain: TransferDomainType.EVM + amount: '3@DFI', + domain: 1 // invalid } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Invalid parameters, src argument "domain" must be either 2 (DFI token to EVM) or 3 (EVM to DFI token)') + await expect(promise).rejects.toThrow('Unknown transfer domain aspect') }) - it('(dvm -> evm) should fail if dst domain is invalid', async () => { + it('(invalid -> dvm) should fail if src domain is invalid', async () => { const promise = client.account.transferDomain([ { src: { address: dvmAddr, amount: '3@DFI', - domain: TransferDomainType.DVM + domain: 1 // invalid }, dst: { address: evmAddr, amount: '3@DFI', - domain: 1 // invalid + domain: TransferDomainType.DVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Unknown transfer domain aspect') + await expect(promise).rejects.toThrow('Invalid parameters, src argument "domain" must be either 2 (DFI token to EVM) or 3 (EVM to DFI token)') }) - it('(dvm -> evm) should fail if src domain is invalid', async () => { + it('(evm -> invalid) should fail if dst domain is invalid', async () => { const promise = client.account.transferDomain([ { src: { address: dvmAddr, amount: '3@DFI', - domain: 1 // invalid + domain: TransferDomainType.EVM }, dst: { address: evmAddr, - amount: '3@BTC', - domain: TransferDomainType.EVM + amount: '3@DFI', + domain: 1 // invalid } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Invalid parameters, src argument "domain" must be either 2 (DFI token to EVM) or 3 (EVM to DFI token)') + await expect(promise).rejects.toThrow('Unknown transfer domain aspect') }) - it('(evm -> dvm) should fail if dst domain is invalid', async () => { + it('(invalid -> evm) should fail if src domain is invalid', async () => { const promise = client.account.transferDomain([ { src: { address: dvmAddr, amount: '3@DFI', - domain: TransferDomainType.EVM - + domain: 1 // invalid }, dst: { address: evmAddr, - amount: '3@BTC', - domain: 1 // invalid + amount: '3@DFI', + domain: TransferDomainType.EVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) - await expect(promise).rejects.toThrow('Source token and destination token must be the same') + await expect(promise).rejects.toThrow('Invalid parameters, src argument "domain" must be either 2 (DFI token to EVM) or 3 (EVM to DFI token)') }) it('(dvm -> dvm) should fail if transfer within same domain', async () => { From a657d5f1875c58329c366e15e92aaf902724984a Mon Sep 17 00:00:00 2001 From: pierregee Date: Fri, 18 Aug 2023 15:45:21 +0800 Subject: [PATCH 10/23] update to latest stable node --- packages/testcontainers/src/containers/DeFiDContainer.ts | 2 +- packages/testcontainers/src/containers/NativeChainContainer.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/testcontainers/src/containers/DeFiDContainer.ts b/packages/testcontainers/src/containers/DeFiDContainer.ts index 379e4461f8..f160411b7a 100644 --- a/packages/testcontainers/src/containers/DeFiDContainer.ts +++ b/packages/testcontainers/src/containers/DeFiDContainer.ts @@ -36,7 +36,7 @@ export abstract class DeFiDContainer extends DockerContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:HEAD-3d8ca2de7' // renovate.json regexManagers + return 'defi/defichain:HEAD-45a4266cd' // renovate.json regexManagers } public static readonly DefaultStartOptions = { diff --git a/packages/testcontainers/src/containers/NativeChainContainer.ts b/packages/testcontainers/src/containers/NativeChainContainer.ts index f5b2ab7e31..fe515200a2 100644 --- a/packages/testcontainers/src/containers/NativeChainContainer.ts +++ b/packages/testcontainers/src/containers/NativeChainContainer.ts @@ -29,7 +29,7 @@ export class NativeChainContainer extends GenericContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:HEAD-3d8ca2de7' // renovate.json regexManagers + return 'defi/defichain:HEAD-45a4266cd' // renovate.json regexManagers } public static readonly PREFIX = 'defichain-testcontainers-' From b8afc550eb5d81a079152b4f6622c06f8a441852 Mon Sep 17 00:00:00 2001 From: pierregee Date: Mon, 21 Aug 2023 09:51:13 +0800 Subject: [PATCH 11/23] update to node rc --- apps/whale-api/docker-compose.yml | 4 ++-- packages/testcontainers/src/containers/DeFiDContainer.ts | 2 +- .../testcontainers/src/containers/NativeChainContainer.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/whale-api/docker-compose.yml b/apps/whale-api/docker-compose.yml index e24dd0c620..8dcf858445 100644 --- a/apps/whale-api/docker-compose.yml +++ b/apps/whale-api/docker-compose.yml @@ -1,8 +1,8 @@ -version: '3.7' +version: "3.7" services: defi-blockchain: - image: defi/defichain:4.0.0-beta8 + image: defi/defichain:4.0.0-rc1 ports: - "19554:19554" command: > diff --git a/packages/testcontainers/src/containers/DeFiDContainer.ts b/packages/testcontainers/src/containers/DeFiDContainer.ts index f160411b7a..86e113ab6e 100644 --- a/packages/testcontainers/src/containers/DeFiDContainer.ts +++ b/packages/testcontainers/src/containers/DeFiDContainer.ts @@ -36,7 +36,7 @@ export abstract class DeFiDContainer extends DockerContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:HEAD-45a4266cd' // renovate.json regexManagers + return 'defi/defichain:4.0.0-rc1' // renovate.json regexManagers } public static readonly DefaultStartOptions = { diff --git a/packages/testcontainers/src/containers/NativeChainContainer.ts b/packages/testcontainers/src/containers/NativeChainContainer.ts index fe515200a2..7fca2eaa3c 100644 --- a/packages/testcontainers/src/containers/NativeChainContainer.ts +++ b/packages/testcontainers/src/containers/NativeChainContainer.ts @@ -29,7 +29,7 @@ export class NativeChainContainer extends GenericContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:HEAD-45a4266cd' // renovate.json regexManagers + return 'defi/defichain:4.0.0-rc1' // renovate.json regexManagers } public static readonly PREFIX = 'defichain-testcontainers-' From 2904cbb64225ea1ceed2e957116830d29c0320e5 Mon Sep 17 00:00:00 2001 From: pierregee Date: Wed, 23 Aug 2023 09:15:10 +0800 Subject: [PATCH 12/23] remove only and add stop on container --- .../__tests__/txn/txn_builder_account_transfer_domain.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts index 2bb974c68f..2e6e6d148f 100644 --- a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts +++ b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts @@ -93,7 +93,7 @@ describe('transferDomain', () => { }) afterAll(async () => { - // await testing.container.stop() + await testing.container.stop() }) describe.only('transferDomain failed', () => { @@ -309,7 +309,7 @@ describe('transferDomain', () => { await expect(promise).rejects.toThrow('DeFiDRpcError: \'TransferDomainTx: tx must have at least one input from account owner (code 16)') }) - it.only('should not transfer if custom (isDAT = false) token is transferred', async () => { + it('should not transfer if custom (isDAT = false) token is transferred', async () => { const invalidDvmScript = P2WPKH.fromAddress(RegTest, await testing.container.getNewAddress(), P2WPKH).getScript() const transferDomain: TransferDomain = { items: [{ From b4fd10f8a0a380eeed7caa7fa6fc46a1eb68f861 Mon Sep 17 00:00:00 2001 From: Harsh R <53080940+fullstackninja864@users.noreply.github.com> Date: Wed, 23 Aug 2023 09:10:53 +0530 Subject: [PATCH 13/23] Update packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts Signed-off-by: Harsh R <53080940+fullstackninja864@users.noreply.github.com> --- .../__tests__/txn/txn_builder_account_transfer_domain.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts index 2e6e6d148f..4959651a07 100644 --- a/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts +++ b/packages/jellyfish-transaction-builder/__tests__/txn/txn_builder_account_transfer_domain.test.ts @@ -96,7 +96,7 @@ describe('transferDomain', () => { await testing.container.stop() }) - describe.only('transferDomain failed', () => { + describe('transferDomain failed', () => { it('should fail if transfer within same domain', async () => { const transferDomain: TransferDomain = { items: [{ From 431dc07b38e8e9265c73bc1e4a751e38458376b7 Mon Sep 17 00:00:00 2001 From: pierregee Date: Wed, 23 Aug 2023 21:09:38 +0800 Subject: [PATCH 14/23] update node to beta10 --- apps/whale-api/docker-compose.yml | 2 +- packages/testcontainers/src/containers/DeFiDContainer.ts | 2 +- packages/testcontainers/src/containers/NativeChainContainer.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/whale-api/docker-compose.yml b/apps/whale-api/docker-compose.yml index 8dcf858445..cc7b37444e 100644 --- a/apps/whale-api/docker-compose.yml +++ b/apps/whale-api/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" services: defi-blockchain: - image: defi/defichain:4.0.0-rc1 + image: defi/defichain:4.0.0-beta10 ports: - "19554:19554" command: > diff --git a/packages/testcontainers/src/containers/DeFiDContainer.ts b/packages/testcontainers/src/containers/DeFiDContainer.ts index 86e113ab6e..873859d6b3 100644 --- a/packages/testcontainers/src/containers/DeFiDContainer.ts +++ b/packages/testcontainers/src/containers/DeFiDContainer.ts @@ -36,7 +36,7 @@ export abstract class DeFiDContainer extends DockerContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:4.0.0-rc1' // renovate.json regexManagers + return 'defi/defichain:4.0.0-beta10' // renovate.json regexManagers } public static readonly DefaultStartOptions = { diff --git a/packages/testcontainers/src/containers/NativeChainContainer.ts b/packages/testcontainers/src/containers/NativeChainContainer.ts index 7fca2eaa3c..4ad924ea29 100644 --- a/packages/testcontainers/src/containers/NativeChainContainer.ts +++ b/packages/testcontainers/src/containers/NativeChainContainer.ts @@ -29,7 +29,7 @@ export class NativeChainContainer extends GenericContainer { if (process?.env?.DEFICHAIN_DOCKER_IMAGE !== undefined) { return process.env.DEFICHAIN_DOCKER_IMAGE } - return 'defi/defichain:4.0.0-rc1' // renovate.json regexManagers + return 'defi/defichain:4.0.0-beta10' // renovate.json regexManagers } public static readonly PREFIX = 'defichain-testcontainers-' From 3eed84e9d8fe05a0563a3dcefa0bde28ba773f2b Mon Sep 17 00:00:00 2001 From: Chloe <44501120+chloezxyy@users.noreply.github.com> Date: Mon, 28 Aug 2023 17:29:22 +0800 Subject: [PATCH 15/23] feat(test): transfer domain for LP tokens (#2145) #### What this PR does / why we need it: #### Which issue(s) does this PR fixes?: Fixes # #### Additional comments?: --- .../category/account/transferDomain.test.ts | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index afe90cc8df..afbec807d6 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -1,7 +1,7 @@ import { MasterNodeRegTestContainer } from '@defichain/testcontainers' import { ContainerAdapterClient } from '../../container_adapter_client' import { TransferDomainType } from '../../../src/category/account' -import { RpcApiError } from '@defichain/jellyfish-api-core/dist/index' +import { RpcApiError } from '@defichain/jellyfish-api-core' import BigNumber from 'bignumber.js' describe('TransferDomain', () => { @@ -56,6 +56,18 @@ describe('TransferDomain', () => { collateralAddress: dvmAddr }]) await container.generate(1) + + // Create LP tokens + const metadata = { + tokenA: 'DFI', + tokenB: 'BTC', + commission: 1, + status: true, + ownerAddress: dvmAddr + } + await client.poolpair.createPoolPair(metadata) + await container.generate(1) + await container.call('minttokens', ['10@BTC']) await container.call('minttokens', ['10@ETH']) await container.call('minttokens', ['10@DESC#128']) @@ -565,6 +577,50 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow('Non-DAT or LP tokens are not supported for transferdomain') }) + it('(evm -> dvm) should fail if LP token is transferred', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: evmAddr, + amount: '10@DFI-BTC', + domain: TransferDomainType.EVM + }, + dst: { + address: dvmAddr, + amount: '10@DFI-BTC', + domain: TransferDomainType.DVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow( + "RpcApiError: 'Test TransferDomainTx execution failed:\n" + + "Non-DAT or LP tokens are not supported for transferdomain', code: -32600, method: transferdomain" + ) + }) + + it('(dvm -> evm) should fail if LP token is transferred', async () => { + const promise = client.account.transferDomain([ + { + src: { + address: dvmAddr, + amount: '10@DFI-BTC', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '10@DFI-BTC', + domain: TransferDomainType.EVM + } + } + ]) + await expect(promise).rejects.toThrow(RpcApiError) + await expect(promise).rejects.toThrow( + "RpcApiError: 'Test TransferDomainTx execution failed:\n" + + "Non-DAT or LP tokens are not supported for transferdomain', code: -32600, method: transferdomain" + ) + }) + it('(dvm -> evm) should fail if (duo) transfer domain', async () => { const promise = client.account.transferDomain([ { From 41c178c36538e776aaca0ede1a3434df0b67d7f3 Mon Sep 17 00:00:00 2001 From: Harsh Date: Mon, 28 Aug 2023 22:34:49 +0530 Subject: [PATCH 16/23] small fix --- .../__tests__/category/account/transferDomain.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index 11dad1e09c..ed62d27369 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -974,7 +974,7 @@ async function createLoanToken (container: MasterNodeRegTestContainer, address: { // Vault Deposit Collateral await container.call('deposittovault', [vaultId, address, '10000@DFI']) - await container.generate(1) + await container.generate(10) } { // Take Loan From d851a14303a52714e8befbc62c2e50e699272fc0 Mon Sep 17 00:00:00 2001 From: Harsh Date: Mon, 28 Aug 2023 23:04:57 +0530 Subject: [PATCH 17/23] gov test fix --- apps/playground-api/__tests__/modules/PlaygroundModule.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/playground-api/__tests__/modules/PlaygroundModule.test.ts b/apps/playground-api/__tests__/modules/PlaygroundModule.test.ts index 44cd39779f..1330fe2c70 100644 --- a/apps/playground-api/__tests__/modules/PlaygroundModule.test.ts +++ b/apps/playground-api/__tests__/modules/PlaygroundModule.test.ts @@ -201,6 +201,9 @@ it('should have gov set', async () => { 'v0/token/18/loan_minting_interest': '3', 'v0/params/feature/icx': 'true', 'v0/params/feature/evm': 'true', + 'v0/transferdomain/dvm-evm/dat-enabled': 'true', + 'v0/transferdomain/evm-dvm/dat-enabled': 'true', + 'v0/transferdomain/evm-dvm/enabled': 'true', 'v0/params/feature/transferdomain': 'true', 'v0/params/foundation/members': [ 'bcrt1qyrfrpadwgw7p5eh3e9h3jmu4kwlz4prx73cqny', From a98ef131b35f43d35281f97702b491abff86bc18 Mon Sep 17 00:00:00 2001 From: Harsh Date: Tue, 29 Aug 2023 10:27:49 +0530 Subject: [PATCH 18/23] updated transferdomain testcse --- .../category/account/transferDomain.test.ts | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index ed62d27369..c226d0d9ee 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -181,22 +181,58 @@ describe('TransferDomain', () => { }) it('(evm -> dvm) should fail if dst address is not legacy or Bech32 address in case of "DVM domain', async () => { + const addressP2SH = await container.getNewAddress('address', 'p2sh-segwit') + // initially transfer DFI + await client.account.transferDomain([ + { + src: { + address: dvmAddr, // invalid + amount: '1@DFI', + domain: TransferDomainType.DVM + }, + dst: { + address: evmAddr, + amount: '1@DFI', + domain: TransferDomainType.EVM + } + } + ]) + await container.generate(1) + const promise = client.account.transferDomain([ { src: { address: evmAddr, - amount: '3@DFI', + amount: '1@DFI', domain: TransferDomainType.EVM }, dst: { - address: evmAddr, // <- not match - amount: '3@DFI', - domain: TransferDomainType.DVM // <- not match + address: addressP2SH, // <- non legacy or Bech32 addres + amount: '1@DFI', + domain: TransferDomainType.DVM } } ]) await expect(promise).rejects.toThrow(RpcApiError) await expect(promise).rejects.toThrow('Dst address must be a legacy or Bech32 address in case of "DVM" domain') + await container.generate(1) + + // revert transfer + await client.account.transferDomain([ + { + src: { + address: evmAddr, + amount: '1@DFI', + domain: TransferDomainType.EVM + }, + dst: { + address: dvmAddr, // invalid + amount: '1@DFI', + domain: TransferDomainType.DVM + } + } + ]) + await container.generate(2) }) it('(dvm -> evm) should fail if dst address is not ERC55 address in case of "EVM" domain', async () => { From c3c0e16dd9cee9faea3d293dc7618532cea65023 Mon Sep 17 00:00:00 2001 From: Harsh R <53080940+fullstackninja864@users.noreply.github.com> Date: Tue, 29 Aug 2023 12:15:26 +0530 Subject: [PATCH 19/23] Update packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts Co-authored-by: canonbrother Signed-off-by: Harsh R <53080940+fullstackninja864@users.noreply.github.com> --- .../__tests__/category/account/transferDomain.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index c226d0d9ee..cfa85df685 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -226,7 +226,7 @@ describe('TransferDomain', () => { domain: TransferDomainType.EVM }, dst: { - address: dvmAddr, // invalid + address: dvmAddr, amount: '1@DFI', domain: TransferDomainType.DVM } From abd161b451be096bc1c7018bb462b18b37fa2615 Mon Sep 17 00:00:00 2001 From: Harsh R <53080940+fullstackninja864@users.noreply.github.com> Date: Tue, 29 Aug 2023 12:15:39 +0530 Subject: [PATCH 20/23] Update packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts Co-authored-by: canonbrother Signed-off-by: Harsh R <53080940+fullstackninja864@users.noreply.github.com> --- .../__tests__/category/account/transferDomain.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index cfa85df685..8c43934569 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -186,7 +186,7 @@ describe('TransferDomain', () => { await client.account.transferDomain([ { src: { - address: dvmAddr, // invalid + address: dvmAddr, amount: '1@DFI', domain: TransferDomainType.DVM }, From aaf170eef41a5c16287eb421d618d503a6736d9c Mon Sep 17 00:00:00 2001 From: Harsh Date: Wed, 30 Aug 2023 13:46:34 +0530 Subject: [PATCH 21/23] minor fix --- .../__tests__/category/account/transferDomain.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index c226d0d9ee..f3e0117b6c 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -180,13 +180,13 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow('Src address must be a legacy or Bech32 address in case of "DVM" domain') }) - it('(evm -> dvm) should fail if dst address is not legacy or Bech32 address in case of "DVM domain', async () => { + it('(evm -> dvm) should fail if dst address is not legacy or Bech32 address in case of "DVM" domain', async () => { const addressP2SH = await container.getNewAddress('address', 'p2sh-segwit') // initially transfer DFI await client.account.transferDomain([ { src: { - address: dvmAddr, // invalid + address: dvmAddr, amount: '1@DFI', domain: TransferDomainType.DVM }, @@ -226,7 +226,7 @@ describe('TransferDomain', () => { domain: TransferDomainType.EVM }, dst: { - address: dvmAddr, // invalid + address: dvmAddr, amount: '1@DFI', domain: TransferDomainType.DVM } From e7fc70d04b3715cbd91a764aad3afa5ffe2a29f0 Mon Sep 17 00:00:00 2001 From: Harsh Date: Wed, 30 Aug 2023 13:52:45 +0530 Subject: [PATCH 22/23] removed commet --- .../__tests__/category/account/transferDomain.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index f3e0117b6c..c8417e2f15 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -167,7 +167,7 @@ describe('TransferDomain', () => { src: { address: evmAddr, // <- not match amount: '3@DFI', - domain: TransferDomainType.DVM // <- not match + domain: TransferDomainType.DVM }, dst: { address: evmAddr, From be50db75d1287e31c199739970e117a8fc761904 Mon Sep 17 00:00:00 2001 From: canonbrother Date: Thu, 31 Aug 2023 00:01:51 +0800 Subject: [PATCH 23/23] refine and ordering --- .../category/account/transferDomain.test.ts | 64 +++++-------------- 1 file changed, 15 insertions(+), 49 deletions(-) diff --git a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts index c8417e2f15..5791b52a92 100644 --- a/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts +++ b/packages/jellyfish-api-core/__tests__/category/account/transferDomain.test.ts @@ -5,7 +5,7 @@ import { RpcApiError } from '@defichain/jellyfish-api-core' import BigNumber from 'bignumber.js' describe('TransferDomain', () => { - let dvmAddr: string, evmAddr: string + let dvmAddr: string, evmAddr: string, p2shAddr: string const container = new MasterNodeRegTestContainer() const client = new ContainerAdapterClient(container) @@ -33,6 +33,8 @@ describe('TransferDomain', () => { dvmAddr = await container.getNewAddress('address1', 'legacy') evmAddr = await container.getNewAddress('erc55', 'erc55') + p2shAddr = await container.getNewAddress('address', 'p2sh-segwit') + await container.call('utxostoaccount', [{ [dvmAddr]: '100000@0' }]) await container.generate(1) @@ -165,7 +167,7 @@ describe('TransferDomain', () => { const promise = client.account.transferDomain([ { src: { - address: evmAddr, // <- not match + address: p2shAddr, // <- non legacy or Bech32 addres amount: '3@DFI', domain: TransferDomainType.DVM }, @@ -181,24 +183,6 @@ describe('TransferDomain', () => { }) it('(evm -> dvm) should fail if dst address is not legacy or Bech32 address in case of "DVM" domain', async () => { - const addressP2SH = await container.getNewAddress('address', 'p2sh-segwit') - // initially transfer DFI - await client.account.transferDomain([ - { - src: { - address: dvmAddr, - amount: '1@DFI', - domain: TransferDomainType.DVM - }, - dst: { - address: evmAddr, - amount: '1@DFI', - domain: TransferDomainType.EVM - } - } - ]) - await container.generate(1) - const promise = client.account.transferDomain([ { src: { @@ -207,7 +191,7 @@ describe('TransferDomain', () => { domain: TransferDomainType.EVM }, dst: { - address: addressP2SH, // <- non legacy or Bech32 addres + address: p2shAddr, // <- non legacy or Bech32 addres amount: '1@DFI', domain: TransferDomainType.DVM } @@ -215,24 +199,6 @@ describe('TransferDomain', () => { ]) await expect(promise).rejects.toThrow(RpcApiError) await expect(promise).rejects.toThrow('Dst address must be a legacy or Bech32 address in case of "DVM" domain') - await container.generate(1) - - // revert transfer - await client.account.transferDomain([ - { - src: { - address: evmAddr, - amount: '1@DFI', - domain: TransferDomainType.EVM - }, - dst: { - address: dvmAddr, - amount: '1@DFI', - domain: TransferDomainType.DVM - } - } - ]) - await container.generate(2) }) it('(dvm -> evm) should fail if dst address is not ERC55 address in case of "EVM" domain', async () => { @@ -618,18 +584,18 @@ describe('TransferDomain', () => { await expect(promise).rejects.toThrow('Non-DAT or LP tokens are not supported for transferdomain') }) - it('(evm -> dvm) should fail if LP token is transferred', async () => { + it('(dvm -> evm) should fail if LP token is transferred', async () => { const promise = client.account.transferDomain([ { src: { - address: evmAddr, + address: dvmAddr, amount: '10@DFI-BTC', - domain: TransferDomainType.EVM + domain: TransferDomainType.DVM }, dst: { - address: dvmAddr, + address: evmAddr, amount: '10@DFI-BTC', - domain: TransferDomainType.DVM + domain: TransferDomainType.EVM } } ]) @@ -640,18 +606,18 @@ describe('TransferDomain', () => { ) }) - it('(dvm -> evm) should fail if LP token is transferred', async () => { + it('(evm -> dvm) should fail if LP token is transferred', async () => { const promise = client.account.transferDomain([ { src: { - address: dvmAddr, + address: evmAddr, amount: '10@DFI-BTC', - domain: TransferDomainType.DVM + domain: TransferDomainType.EVM }, dst: { - address: evmAddr, + address: dvmAddr, amount: '10@DFI-BTC', - domain: TransferDomainType.EVM + domain: TransferDomainType.DVM } } ])