PHP WebShell
Текущая директория: /opt/BitGoJS/modules/abstract-eth/src/lib/transferBuilders
Просмотр файла: transferBuilderERC1155.ts
import { BuildTransactionError, InvalidParameterValueError } from '@bitgo/sdk-core';
import { hexlify, hexZeroPad } from 'ethers/lib/utils';
import { ContractCall } from '../contractCall';
import { decodeERC1155TransferData, isValidEthAddress, sendMultiSigData } from '../utils';
import {
ERC1155BatchTransferTypes,
ERC1155SafeTransferTypes,
ERC1155BatchTransferTypeMethodId,
ERC1155SafeTransferTypeMethodId,
} from '../walletUtil';
import { BaseNFTTransferBuilder } from './baseNFTTransferBuilder';
import { coins, EthereumNetwork as EthLikeNetwork } from '@bitgo/statics';
export class ERC1155TransferBuilder extends BaseNFTTransferBuilder {
private _tokenIds: string[];
private _values: string[];
private _bytes: string;
constructor(serializedData?: string) {
super(serializedData);
this.bytes(0);
if (serializedData) {
this.decodeTransferData(serializedData);
} else {
this._tokenIds = [];
this._values = [];
}
}
coin(coin: string): ERC1155TransferBuilder {
this._coin = coins.get(coin);
this._nativeCoinOperationHashPrefix = (this._coin.network as EthLikeNetwork).nativeCoinOperationHashPrefix;
return this;
}
tokenContractAddress(address: string): ERC1155TransferBuilder {
if (isValidEthAddress(address)) {
this._tokenContractAddress = address;
return this;
}
throw new InvalidParameterValueError('Invalid address');
}
entry(tokenId: number, value: number): ERC1155TransferBuilder {
this._tokenIds.push(tokenId.toString());
this._values.push(value.toString());
return this;
}
bytes(bytesInNumber: number): ERC1155TransferBuilder {
this._bytes = hexZeroPad(hexlify(bytesInNumber), 32);
return this;
}
getIsFirstSigner(): boolean {
return false;
}
signAndBuild(chainId: string): string {
this._chainId = chainId;
const hasMandatoryFields = this.hasMandatoryFields();
if (hasMandatoryFields) {
this._data = this.build();
return sendMultiSigData(
this._tokenContractAddress,
'0', // dummy amount value
this._data,
this._expirationTime,
this._sequenceId,
this.getSignature()
);
}
throw new BuildTransactionError(
`Missing transfer mandatory fields.
Destination (to) address, source (from) address, sequenceID, the token contract address, tokenIDs and their values are mandatory`
);
}
private hasMandatoryFields(): boolean {
return (
this._tokenIds !== undefined &&
this._tokenIds.length !== 0 &&
this._values.length !== 0 &&
this._tokenIds.length === this._values.length &&
this._toAddress !== undefined &&
this._fromAddress !== undefined &&
this._tokenContractAddress !== undefined &&
this._sequenceId !== undefined
);
}
private decodeTransferData(data: string): void {
const transferData = decodeERC1155TransferData(data);
this._toAddress = transferData.to;
this._fromAddress = transferData.from;
this._expirationTime = transferData.expireTime;
this._sequenceId = transferData.sequenceId;
this._signature = transferData.signature;
this._tokenContractAddress = transferData.tokenContractAddress;
this._tokenIds = transferData.tokenIds;
this._values = transferData.values;
if (transferData.data) {
this._data = transferData.data;
}
}
build(): string {
if (this._tokenIds.length === 1) {
const values = [this._fromAddress, this._toAddress, this._tokenIds[0], this._values[0], this._bytes];
const contractCall = new ContractCall(ERC1155SafeTransferTypeMethodId, ERC1155SafeTransferTypes, values);
return contractCall.serialize();
} else {
const values = [this._fromAddress, this._toAddress, this._tokenIds, this._values, this._bytes];
const contractCall = new ContractCall(ERC1155BatchTransferTypeMethodId, ERC1155BatchTransferTypes, values);
return contractCall.serialize();
}
}
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!