UNPKG

gemsdkbeta

Version:

JavaScript SDK for the GEM swap

200 lines 9.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.encodeProxyCall = exports.encodeTransferCall = exports.encodeAtomicizedTransfer = exports.encodeDefaultCall = exports.encodeBuy = exports.encodeAtomicizedBuy = exports.encodeAtomicizedSell = exports.encodeSell = exports.encodeCall = exports.encodeReplacementPattern = exports.AbiType = void 0; var bignumber_js_1 = require("bignumber.js"); var ethABI = require("ethereumjs-abi"); var wyvern_js_1 = require("wyvern-js"); var types_1 = require("wyvern-schemas/dist/types"); var wyvern_schemas_1 = require("wyvern-schemas"); Object.defineProperty(exports, "AbiType", { enumerable: true, get: function () { return wyvern_schemas_1.AbiType; } }); var types_2 = require("../types"); var Proxy_1 = require("../abi/Proxy"); exports.encodeReplacementPattern = wyvern_js_1.WyvernProtocol.encodeReplacementPattern; var encodeCall = function (abi, parameters) { var inputTypes = abi.inputs.map(function (i) { return i.type; }); return '0x' + Buffer.concat([ ethABI.methodID(abi.name, inputTypes), ethABI.rawEncode(inputTypes, parameters), ]).toString('hex'); }; exports.encodeCall = encodeCall; var encodeSell = function (schema, asset, address) { var transfer = schema.functions.transfer(asset); return { target: transfer.target, calldata: exports.encodeDefaultCall(transfer, address), replacementPattern: exports.encodeReplacementPattern(transfer), }; }; exports.encodeSell = encodeSell; var encodeAtomicizedSell = function (schemas, assets, address, wyvernProtocol, networkName) { var atomicizer = wyvernProtocol.wyvernAtomicizer; var _a = encodeAtomicizedCalldata(atomicizer, schemas, assets, address, types_2.OrderSide.Sell), atomicizedCalldata = _a.atomicizedCalldata, atomicizedReplacementPattern = _a.atomicizedReplacementPattern; return { calldata: atomicizedCalldata, replacementPattern: atomicizedReplacementPattern, target: wyvern_js_1.WyvernProtocol.getAtomicizerContractAddress(networkName) }; }; exports.encodeAtomicizedSell = encodeAtomicizedSell; var encodeAtomicizedBuy = function (schemas, assets, address, wyvernProtocol, networkName) { var atomicizer = wyvernProtocol.wyvernAtomicizer; var _a = encodeAtomicizedCalldata(atomicizer, schemas, assets, address, types_2.OrderSide.Buy), atomicizedCalldata = _a.atomicizedCalldata, atomicizedReplacementPattern = _a.atomicizedReplacementPattern; return { calldata: atomicizedCalldata, replacementPattern: atomicizedReplacementPattern, target: wyvern_js_1.WyvernProtocol.getAtomicizerContractAddress(networkName) }; }; exports.encodeAtomicizedBuy = encodeAtomicizedBuy; var encodeBuy = function (schema, asset, address) { var transfer = schema.functions.transfer(asset); var replaceables = transfer.inputs.filter(function (i) { return i.kind === types_1.FunctionInputKind.Replaceable; }); var ownerInputs = transfer.inputs.filter(function (i) { return i.kind === types_1.FunctionInputKind.Owner; }); // Validate if (replaceables.length !== 1) { throw new Error('Only 1 input can match transfer destination, but instead ' + replaceables.length + ' did'); } // Compute calldata var parameters = transfer.inputs.map(function (input) { switch (input.kind) { case types_1.FunctionInputKind.Replaceable: return address; case types_1.FunctionInputKind.Owner: return wyvern_js_1.WyvernProtocol.generateDefaultValue(input.type); default: try { return input.value.toString(); } catch (e) { console.error(schema); console.error(asset); throw e; } } }); var calldata = exports.encodeCall(transfer, parameters); // Compute replacement pattern var replacementPattern = '0x'; if (ownerInputs.length > 0) { replacementPattern = exports.encodeReplacementPattern(transfer, types_1.FunctionInputKind.Owner); } return { target: transfer.target, calldata: calldata, replacementPattern: replacementPattern, }; }; exports.encodeBuy = encodeBuy; var encodeDefaultCall = function (abi, address) { var parameters = abi.inputs.map(function (input) { switch (input.kind) { case types_1.FunctionInputKind.Replaceable: return wyvern_js_1.WyvernProtocol.generateDefaultValue(input.type); case types_1.FunctionInputKind.Owner: return address; case types_1.FunctionInputKind.Asset: default: return input.value; } }); return exports.encodeCall(abi, parameters); }; exports.encodeDefaultCall = encodeDefaultCall; /** * Encode the atomicized transfer of many assets * @param schema Wyvern Schema for the assets * @param assets List of assets to transfer * @param from Current address owning the assets * @param to Destination address * @param atomicizer Wyvern Atomicizer instance */ function encodeAtomicizedTransfer(schemas, assets, from, to, wyvernProtocol, networkName) { var atomicizer = wyvernProtocol.wyvernAtomicizer; var transactions = assets.map(function (asset, i) { var schema = schemas[i]; var transfer = schema.functions.transfer(asset); var calldata = encodeTransferCall(transfer, from, to); return { calldata: calldata, address: transfer.target, value: new bignumber_js_1.BigNumber(0), }; }); var atomicizedCalldata = atomicizer.atomicize.getABIEncodedTransactionData(transactions.map(function (t) { return t.address; }), transactions.map(function (t) { return t.value; }), transactions.map(function (t) { return new bignumber_js_1.BigNumber((t.calldata.length - 2) / 2); }), // subtract 2 for '0x', divide by 2 for hex transactions.map(function (t) { return t.calldata; }).reduce(function (x, current) { return x + current.slice(2); }, '0x')); return { calldata: atomicizedCalldata, target: wyvern_js_1.WyvernProtocol.getAtomicizerContractAddress(networkName) }; } exports.encodeAtomicizedTransfer = encodeAtomicizedTransfer; /** * Encode a transfer call for a Wyvern schema function * @param transferAbi Annotated Wyvern ABI * @param from From address * @param to To address */ function encodeTransferCall(transferAbi, from, to) { var parameters = transferAbi.inputs.map(function (input) { switch (input.kind) { case types_1.FunctionInputKind.Replaceable: return to; case types_1.FunctionInputKind.Owner: return from; case types_1.FunctionInputKind.Asset: default: if (input.value == null) { throw new Error("Unsupported function input kind: " + input.kind); } return input.value; } }); return exports.encodeCall(transferAbi, parameters); } exports.encodeTransferCall = encodeTransferCall; /** * Encode a call to a user's proxy contract * @param address The address for the proxy to call * @param howToCall How to call the addres * @param calldata The data to use in the call * @param shouldAssert Whether to assert success in the proxy call */ function encodeProxyCall(address, howToCall, calldata, shouldAssert) { if (shouldAssert === void 0) { shouldAssert = true; } var abi = shouldAssert ? Proxy_1.proxyAssertABI : Proxy_1.proxyABI; return exports.encodeCall(abi, [address, howToCall, Buffer.from(calldata.slice(2), 'hex')]); } exports.encodeProxyCall = encodeProxyCall; // Helpers for atomicizer function encodeAtomicizedCalldata(atomicizer, schemas, assets, address, side) { var encoder = side === types_2.OrderSide.Sell ? exports.encodeSell : exports.encodeBuy; try { var transactions = assets.map(function (asset, i) { var schema = schemas[i]; var _a = encoder(schema, asset, address), target = _a.target, calldata = _a.calldata; return { calldata: calldata, abi: schema.functions.transfer(asset), address: target, value: new bignumber_js_1.BigNumber(0), }; }); var atomicizedCalldata = atomicizer.atomicize.getABIEncodedTransactionData(transactions.map(function (t) { return t.address; }), transactions.map(function (t) { return t.value; }), transactions.map(function (t) { return new bignumber_js_1.BigNumber((t.calldata.length - 2) / 2); }), // subtract 2 for '0x', divide by 2 for hex transactions.map(function (t) { return t.calldata; }).reduce(function (x, y) { return x + y.slice(2); })); var kind = side === types_2.OrderSide.Buy ? types_1.FunctionInputKind.Owner : undefined; var atomicizedReplacementPattern = wyvern_js_1.WyvernProtocol.encodeAtomicizedReplacementPattern(transactions.map(function (t) { return t.abi; }), kind); if (!atomicizedCalldata || !atomicizedReplacementPattern) { throw new Error("Invalid calldata: " + atomicizedCalldata + ", " + atomicizedReplacementPattern); } return { atomicizedCalldata: atomicizedCalldata, atomicizedReplacementPattern: atomicizedReplacementPattern }; } catch (error) { console.error({ schemas: schemas, assets: assets, address: address, side: side }); throw new Error("Failed to construct your order: likely something strange about this type of item. OpenSea has been notified. Please contact us in Discord! Original error: " + error); } } //# sourceMappingURL=schema.js.map