mirror of
				https://github.com/Xahau/xahau.js.git
				synced 2025-11-04 13:05:49 +00:00 
			
		
		
		
	* add apiVersion support to requests and AccountInfoResponse v1/v2 types * fix submitAndWait signature * update docker container README * update tests * fix apiVersion param in wrong position of Client.request * add integ tests * update HISTORY.md * fix request.api_version * update RIPPLED_DOCKER_IMAGE to use v2.1.0 * refactor Client.request signature * update rippled docker image * fix Client.requestAll * update rippled docker image to use v2.1.1 * update README * use import type * fix faucet; unrelated to PR * add api_version v2 support and set as default while providing support for v1 * refactor: add apiVersion to Client * resolve errors * use DeliverMax for isPartialPayment check * update fixtures * resolve lint errors * add API v1 support for isPartialPayment * update CONTRIBUTING * update accountTx JSDoc * revert deleted JSDoc comments in accountTx * update JSDoc for account_info response * only use client.apiVersion in Client.request() * add ledger_hash * remove API v1 comment from v2 model * update meta_blob JSDoc * delete second AccountTxRequest matching * add close_time_iso * set close_time_iso as optional field * add meta_blob to BaseResponse * Revert "add meta_blob to BaseResponse" This reverts commit 89794c629dc515915e28752d7c2552bfeab266a3. * use DEFAULT_API_VERSION throughout call stack * improve JSDoc explanation of ledger_index * remove this.apiVersion from getLedgerIndex * refactor Client.request() * refactor RequestManger.resolve() * add TODO to fix TxResponse type assertion * use @category ResponsesV1 for API v1 types * refactor accountTxHasPartialPayment() * remove TODO
		
			
				
	
	
		
			188 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { assert } from 'chai'
 | 
						|
import { decode } from 'ripple-binary-codec'
 | 
						|
 | 
						|
import {
 | 
						|
  AccountSet,
 | 
						|
  Client,
 | 
						|
  SignerListSet,
 | 
						|
  Transaction,
 | 
						|
  SubmitMultisignedResponse,
 | 
						|
  hashes,
 | 
						|
  SubmitMultisignedRequest,
 | 
						|
  SubmitMultisignedV1Response,
 | 
						|
} from '../../../src'
 | 
						|
import { convertStringToHex } from '../../../src/utils'
 | 
						|
import { multisign } from '../../../src/Wallet/signer'
 | 
						|
import serverUrl from '../serverUrl'
 | 
						|
import {
 | 
						|
  setupClient,
 | 
						|
  teardownClient,
 | 
						|
  type XrplIntegrationTestContext,
 | 
						|
} from '../setup'
 | 
						|
import {
 | 
						|
  generateFundedWallet,
 | 
						|
  ledgerAccept,
 | 
						|
  testTransaction,
 | 
						|
  verifySubmittedTransaction,
 | 
						|
} from '../utils'
 | 
						|
 | 
						|
// how long before each test case times out
 | 
						|
const TIMEOUT = 20000
 | 
						|
const { hashSignedTx } = hashes
 | 
						|
 | 
						|
describe('submit_multisigned', function () {
 | 
						|
  let testContext: XrplIntegrationTestContext
 | 
						|
 | 
						|
  beforeEach(async () => {
 | 
						|
    testContext = await setupClient(serverUrl)
 | 
						|
  })
 | 
						|
  afterEach(async () => teardownClient(testContext))
 | 
						|
 | 
						|
  it(
 | 
						|
    'submit_multisigned transaction',
 | 
						|
    async () => {
 | 
						|
      const client: Client = testContext.client
 | 
						|
      const signerWallet1 = await generateFundedWallet(testContext.client)
 | 
						|
      const signerWallet2 = await generateFundedWallet(testContext.client)
 | 
						|
 | 
						|
      // set up the multisigners for the account
 | 
						|
      const signerListSet: SignerListSet = {
 | 
						|
        TransactionType: 'SignerListSet',
 | 
						|
        Account: testContext.wallet.classicAddress,
 | 
						|
        SignerEntries: [
 | 
						|
          {
 | 
						|
            SignerEntry: {
 | 
						|
              Account: signerWallet1.classicAddress,
 | 
						|
              SignerWeight: 1,
 | 
						|
            },
 | 
						|
          },
 | 
						|
          {
 | 
						|
            SignerEntry: {
 | 
						|
              Account: signerWallet2.classicAddress,
 | 
						|
              SignerWeight: 1,
 | 
						|
            },
 | 
						|
          },
 | 
						|
        ],
 | 
						|
        SignerQuorum: 2,
 | 
						|
      }
 | 
						|
      await testTransaction(
 | 
						|
        testContext.client,
 | 
						|
        signerListSet,
 | 
						|
        testContext.wallet,
 | 
						|
      )
 | 
						|
 | 
						|
      // try to multisign
 | 
						|
      const accountSet: AccountSet = {
 | 
						|
        TransactionType: 'AccountSet',
 | 
						|
        Account: testContext.wallet.classicAddress,
 | 
						|
        Domain: convertStringToHex('example.com'),
 | 
						|
      }
 | 
						|
      const accountSetTx = await client.autofill(accountSet, 2)
 | 
						|
      const signed1 = signerWallet1.sign(accountSetTx, true)
 | 
						|
      const signed2 = signerWallet2.sign(accountSetTx, true)
 | 
						|
      const multisigned = multisign([signed1.tx_blob, signed2.tx_blob])
 | 
						|
      const submitResponse = await client.request({
 | 
						|
        command: 'submit_multisigned',
 | 
						|
        tx_json: decode(multisigned) as unknown as Transaction,
 | 
						|
      })
 | 
						|
      await ledgerAccept(client)
 | 
						|
      assert.strictEqual(submitResponse.result.engine_result, 'tesSUCCESS')
 | 
						|
      await verifySubmittedTransaction(testContext.client, multisigned)
 | 
						|
 | 
						|
      const expectedResponse: SubmitMultisignedResponse = {
 | 
						|
        api_version: 2,
 | 
						|
        id: submitResponse.id,
 | 
						|
        type: 'response',
 | 
						|
        result: {
 | 
						|
          engine_result: 'tesSUCCESS',
 | 
						|
          engine_result_code: 0,
 | 
						|
          engine_result_message:
 | 
						|
            'The transaction was applied. Only final in a validated ledger.',
 | 
						|
          tx_blob: multisigned,
 | 
						|
          tx_json: {
 | 
						|
            ...(decode(multisigned) as unknown as Transaction),
 | 
						|
          },
 | 
						|
          hash: hashSignedTx(multisigned),
 | 
						|
        },
 | 
						|
      }
 | 
						|
 | 
						|
      assert.deepEqual(submitResponse, expectedResponse)
 | 
						|
    },
 | 
						|
    TIMEOUT,
 | 
						|
  )
 | 
						|
 | 
						|
  it(
 | 
						|
    'submit_multisigned transaction using api_version 1',
 | 
						|
    async () => {
 | 
						|
      const client: Client = testContext.client
 | 
						|
      const signerWallet1 = await generateFundedWallet(testContext.client)
 | 
						|
      const signerWallet2 = await generateFundedWallet(testContext.client)
 | 
						|
 | 
						|
      // set up the multisigners for the account
 | 
						|
      const signerListSet: SignerListSet = {
 | 
						|
        TransactionType: 'SignerListSet',
 | 
						|
        Account: testContext.wallet.classicAddress,
 | 
						|
        SignerEntries: [
 | 
						|
          {
 | 
						|
            SignerEntry: {
 | 
						|
              Account: signerWallet1.classicAddress,
 | 
						|
              SignerWeight: 1,
 | 
						|
            },
 | 
						|
          },
 | 
						|
          {
 | 
						|
            SignerEntry: {
 | 
						|
              Account: signerWallet2.classicAddress,
 | 
						|
              SignerWeight: 1,
 | 
						|
            },
 | 
						|
          },
 | 
						|
        ],
 | 
						|
        SignerQuorum: 2,
 | 
						|
      }
 | 
						|
      await testTransaction(
 | 
						|
        testContext.client,
 | 
						|
        signerListSet,
 | 
						|
        testContext.wallet,
 | 
						|
      )
 | 
						|
 | 
						|
      // try to multisign
 | 
						|
      const accountSet: AccountSet = {
 | 
						|
        TransactionType: 'AccountSet',
 | 
						|
        Account: testContext.wallet.classicAddress,
 | 
						|
        Domain: convertStringToHex('example.com'),
 | 
						|
      }
 | 
						|
      const accountSetTx = await client.autofill(accountSet, 2)
 | 
						|
      const signed1 = signerWallet1.sign(accountSetTx, true)
 | 
						|
      const signed2 = signerWallet2.sign(accountSetTx, true)
 | 
						|
      const multisigned = multisign([signed1.tx_blob, signed2.tx_blob])
 | 
						|
      const submitResponse = await client.request<SubmitMultisignedRequest, 1>({
 | 
						|
        command: 'submit_multisigned',
 | 
						|
        tx_json: decode(multisigned) as unknown as Transaction,
 | 
						|
        api_version: 1,
 | 
						|
      })
 | 
						|
      await ledgerAccept(client)
 | 
						|
      assert.strictEqual(submitResponse.result.engine_result, 'tesSUCCESS')
 | 
						|
      await verifySubmittedTransaction(testContext.client, multisigned)
 | 
						|
 | 
						|
      const expectedResponse: SubmitMultisignedV1Response = {
 | 
						|
        api_version: 1,
 | 
						|
        id: submitResponse.id,
 | 
						|
        type: 'response',
 | 
						|
        result: {
 | 
						|
          engine_result: 'tesSUCCESS',
 | 
						|
          engine_result_code: 0,
 | 
						|
          engine_result_message:
 | 
						|
            'The transaction was applied. Only final in a validated ledger.',
 | 
						|
          tx_blob: multisigned,
 | 
						|
          tx_json: {
 | 
						|
            ...(decode(multisigned) as unknown as Transaction),
 | 
						|
            hash: hashSignedTx(multisigned),
 | 
						|
          },
 | 
						|
        },
 | 
						|
      }
 | 
						|
 | 
						|
      assert.deepEqual(submitResponse, expectedResponse)
 | 
						|
    },
 | 
						|
    TIMEOUT,
 | 
						|
  )
 | 
						|
})
 |