PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-eth/test/unit/transactionBuilder

Просмотр файла: sendNFT.ts

import { TransactionType } from '@bitgo/sdk-core';
import { coins, EthereumNetwork as EthLikeNetwork } from '@bitgo/statics';
import { ERC1155TransferBuilder, ERC721TransferBuilder, TransactionBuilder } from '../../../src';
import * as testData from '../../resources/eth';
import { ethers } from 'ethers';
import should from 'should';
import { ERC1155ABI } from '../../resources/erc1155Abi';
import { walletSimpleABI } from '../../resources/walletSimpleAbi';
import { erc721ABI } from '../../resources/erc721Abi';
import {
  erc1155BatchTransferEncoding,
  erc1155SafeTransferEncoding,
  erc721Encoding,
} from '../../resources/nftEncodings';
import { getBuilder } from '../getBuilder';

describe('Eth transaction builder sendNFT', () => {
  // dummy addresses
  const owner = '0x19645032c7f1533395d44a629462e751084d3e4d';
  const recipient = '0x19645032c7f1533395d44a629462e751084d3e4c';
  const contractAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';

  // ens erc721
  const erc721ContractAddress = '0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85';
  // opensea erc1155
  const erc1155ContractAddress = '0x495f947276749ce646f68ac8c248420045cb7b5e';
  const coin = coins.get('hteth') as unknown as EthLikeNetwork;
  let key;

  beforeEach(() => {
    key = testData.KEYPAIR_PRV.getKeys().prv as string;
  });

  it('should sign ERC721 properly', async () => {
    const txBuilder = getBuilder('hteth') as TransactionBuilder;
    txBuilder.fee({
      fee: '1000000000',
      gasLimit: '12100000',
    });
    txBuilder.counter(2);
    txBuilder.contract(contractAddress);
    txBuilder.type(TransactionType.SendERC721);

    // Dummy addresses
    const expireTime = 1590066728;
    const sequenceId = 5;
    const tokenId = '1';

    const erc721Transfer = txBuilder.transfer() as ERC721TransferBuilder;
    erc721Transfer
      .from(owner)
      .to(recipient)
      .expirationTime(expireTime)
      .tokenContractAddress(erc721ContractAddress)
      .contractSequenceId(sequenceId)
      .tokenId(tokenId)
      .key(key);

    txBuilder.sign({ key: testData.PRIVATE_KEY });
    await txBuilder.build();
  });

  it('should sign and build ERC721 transfer with Builder pattern', async () => {
    const txBuilder = getBuilder('hteth') as TransactionBuilder;
    txBuilder.fee({
      fee: '1000000000',
      gasLimit: '12100000',
    });
    txBuilder.counter(2);
    txBuilder.contract(contractAddress);
    txBuilder.type(TransactionType.SendERC721);

    // Dummy addresses
    const expireTime = 1590066728;
    const sequenceId = 5;
    const tokenId = '1';

    const erc721Transfer = txBuilder.transfer() as ERC721TransferBuilder;
    erc721Transfer
      .from(owner)
      .to(recipient)
      .expirationTime(expireTime)
      .tokenContractAddress(erc721ContractAddress)
      .contractSequenceId(sequenceId)
      .tokenId(tokenId)
      .key(key);

    const sendMultisigCallData = erc721Transfer.signAndBuild(`${coin.chainId}`);
    const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleABI), sendMultisigCallData);

    const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
    const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(erc721ABI), safeTransferFromCallData);

    should.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[2], tokenId);
  });

  it('should sign and build ERC721 transfer with Decoder pattern', async () => {
    const txBuilder = getBuilder('hteth') as TransactionBuilder;
    txBuilder.fee({
      fee: '1000000000',
      gasLimit: '12100000',
    });
    txBuilder.counter(2);
    txBuilder.contract(contractAddress);
    txBuilder.type(TransactionType.SendERC721);

    const tokenId = '1';

    const erc721Transfer = txBuilder.transfer(erc721Encoding) as ERC721TransferBuilder;
    const sendMultisigCallData = erc721Transfer.signAndBuild(`${coin.chainId}`);
    const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleABI), sendMultisigCallData);

    const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
    const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(erc721ABI), safeTransferFromCallData);

    should.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[2], tokenId);
  });

  it('should sign and build ERC1155 single transfer with Builder pattern', async () => {
    const txBuilder = getBuilder('hteth') as TransactionBuilder;
    txBuilder.fee({
      fee: '1000000000',
      gasLimit: '12100000',
    });
    txBuilder.counter(2);
    txBuilder.contract(contractAddress);
    txBuilder.type(TransactionType.SendERC1155);

    const expireTime = 1590066728;
    const sequenceId = 5;
    const tokenId = 1;
    const value = 10;

    const erc1155Transfer = txBuilder.transfer() as ERC1155TransferBuilder;
    erc1155Transfer
      .from(owner)
      .to(recipient)
      .expirationTime(expireTime)
      .tokenContractAddress(erc1155ContractAddress)
      .contractSequenceId(sequenceId)
      .entry(tokenId, value)
      .key(key);

    const sendMultisigCallData = erc1155Transfer.signAndBuild(`${coin.chainId}`);
    const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleABI), sendMultisigCallData);

    const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
    const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(ERC1155ABI), safeTransferFromCallData);

    should.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[2], tokenId);
    should.equal(decodedSafeTransferFromCallData.args[3], value);

    txBuilder.sign({ key: testData.PRIVATE_KEY });
    await txBuilder.build();
  });

  it('should sign and build ERC1155 single transfer with Decoder pattern', async () => {
    const txBuilder = getBuilder('hteth') as TransactionBuilder;
    txBuilder.fee({
      fee: '1000000000',
      gasLimit: '12100000',
    });
    txBuilder.counter(2);
    txBuilder.contract(contractAddress);
    txBuilder.type(TransactionType.SendERC1155);

    const tokenId = '1';
    const value = '10';

    const erc1155Transfer = txBuilder.transfer(erc1155SafeTransferEncoding) as ERC1155TransferBuilder;
    const sendMultisigCallData = erc1155Transfer.signAndBuild(`${coin.chainId}`);

    const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleABI), sendMultisigCallData);

    const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
    const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(ERC1155ABI), safeTransferFromCallData);

    should.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[2], tokenId);
    should.equal(decodedSafeTransferFromCallData.args[3], value);
  });

  it('should sign and build ERC1155 batch transfer with Builder pattern', async () => {
    const txBuilder = getBuilder('hteth') as TransactionBuilder;
    txBuilder.fee({
      fee: '1000000000',
      gasLimit: '12100000',
    });
    txBuilder.counter(2);
    txBuilder.contract(contractAddress);
    txBuilder.type(TransactionType.SendERC1155);

    const expireTime = 1590066728;
    const sequenceId = 5;
    const tokenIds = [1, 2, 3];
    const values = [10, 10, 10];

    const erc1155Transfer = txBuilder.transfer() as ERC1155TransferBuilder;
    erc1155Transfer
      .from(owner)
      .to(recipient)
      .expirationTime(expireTime)
      .tokenContractAddress(erc1155ContractAddress)
      .contractSequenceId(sequenceId)
      .entry(tokenIds[0], values[0])
      .entry(tokenIds[1], values[1])
      .entry(tokenIds[2], values[2])
      .key(key);

    const sendMultisigCallData = erc1155Transfer.signAndBuild(`${coin.chainId}`);
    const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleABI), sendMultisigCallData);

    const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
    const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(ERC1155ABI), safeTransferFromCallData);

    should.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
    should.deepEqual(
      decodedSafeTransferFromCallData.args[2].map((x) => x.toNumber()),
      tokenIds
    );
    should.deepEqual(
      decodedSafeTransferFromCallData.args[3].map((x) => x.toNumber()),
      values
    );
  });

  it('should sign and build ERC1155 batch transfer with Decoder pattern', async () => {
    const txBuilder = getBuilder('hteth') as TransactionBuilder;
    txBuilder.fee({
      fee: '1000000000',
      gasLimit: '12100000',
    });
    txBuilder.counter(2);
    txBuilder.contract(contractAddress);
    txBuilder.type(TransactionType.SendERC1155);

    const tokenIds = [1, 2, 3];
    const values = [10, 10, 10];

    const erc1155Transfer = txBuilder.transfer(erc1155BatchTransferEncoding) as ERC1155TransferBuilder;

    const sendMultisigCallData = erc1155Transfer.signAndBuild(`${coin.chainId}`);
    const decodedSendMultisigCallData = decodeTransaction(JSON.stringify(walletSimpleABI), sendMultisigCallData);

    const safeTransferFromCallData = decodedSendMultisigCallData.args[2];
    const decodedSafeTransferFromCallData = decodeTransaction(JSON.stringify(ERC1155ABI), safeTransferFromCallData);

    should.equal(decodedSafeTransferFromCallData.args[0].toLowerCase(), owner.toLowerCase());
    should.equal(decodedSafeTransferFromCallData.args[1].toLowerCase(), recipient.toLowerCase());
    should.deepEqual(
      decodedSafeTransferFromCallData.args[2].map((x) => x.toNumber()),
      tokenIds
    );
    should.deepEqual(
      decodedSafeTransferFromCallData.args[3].map((x) => x.toNumber()),
      values
    );
  });
});

function decodeTransaction(abi: string, calldata: string) {
  const contractInterface = new ethers.utils.Interface(abi);
  return contractInterface.parseTransaction({ data: calldata });
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!