aboutsummaryrefslogtreecommitdiffstats
path: root/packages/utils/src/zeroex_transaction_decoder.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/utils/src/zeroex_transaction_decoder.ts')
-rw-r--r--packages/utils/src/zeroex_transaction_decoder.ts55
1 files changed, 55 insertions, 0 deletions
diff --git a/packages/utils/src/zeroex_transaction_decoder.ts b/packages/utils/src/zeroex_transaction_decoder.ts
new file mode 100644
index 000000000..049596770
--- /dev/null
+++ b/packages/utils/src/zeroex_transaction_decoder.ts
@@ -0,0 +1,55 @@
+import { TransactionDecoder } from './transaction_decoder';
+import { getContractAddressesForNetworkOrThrow, NetworkId } from '@0x/contract-addresses';
+import * as ContractArtifacts from '@0x/contract-artifacts';
+import { SimpleContractArtifact } from '@0x/types';
+import { AbiDefinition, ContractAbi } from 'ethereum-types';
+import { TransactionData, DeployedContractInfo, DeployedContractInfoByName, TransactionProperties } from './types';
+import * as _ from 'lodash';
+
+export class ZeroExTransactionDecoder extends TransactionDecoder {
+ private readonly _deployedContractInfoByName = {} as DeployedContractInfoByName;
+ private static _instance: ZeroExTransactionDecoder;
+
+ private static getInstance(): ZeroExTransactionDecoder {
+ if (!ZeroExTransactionDecoder._instance) {
+ ZeroExTransactionDecoder._instance = new ZeroExTransactionDecoder();
+ }
+ return ZeroExTransactionDecoder._instance;
+ }
+
+ private constructor() {
+ super();
+ // Load addresses by contract name
+ _.each(NetworkId, (networkId: any) => {
+ if (typeof networkId !== 'number') return;
+ const networkIdAsNumber = networkId as number;
+ const contractAddressesForNetwork = getContractAddressesForNetworkOrThrow(networkIdAsNumber);
+ _.each(contractAddressesForNetwork, (contractAddress: string, contractName: string) => {
+ const contractNameLowercase = _.toLower(contractName);
+ if (_.isUndefined(this._deployedContractInfoByName[contractNameLowercase])) {
+ this._deployedContractInfoByName[contractNameLowercase] = [];
+ }
+ this._deployedContractInfoByName[contractNameLowercase].push({contractAddress, networkId: networkIdAsNumber});
+ });
+ });
+ // Load contract artifacts
+ _.each(ContractArtifacts, (contractArtifactAsJson: any) => {
+ const conractArtifact = contractArtifactAsJson as SimpleContractArtifact;
+ const contractName = conractArtifact.contractName;
+ const contractNameLowercase = _.toLower(contractName);
+ const contractAbi: ContractAbi = conractArtifact.compilerOutput.abi;
+ this.addABI(contractAbi, contractName, this._deployedContractInfoByName[contractNameLowercase]);
+ });
+ }
+
+ public static addABI(abiArray: AbiDefinition[], contractName: string, deploymentInfos?: DeployedContractInfo[]): void {
+ const instance = ZeroExTransactionDecoder.getInstance();
+ instance.addABI(abiArray, contractName, deploymentInfos);
+ }
+
+ public static decode(calldata: string, txProperties?: TransactionProperties): TransactionData {
+ const instance = ZeroExTransactionDecoder.getInstance();
+ const decodedCalldata = instance.decode(calldata, txProperties);
+ return decodedCalldata;
+ }
+} \ No newline at end of file