axie-tools
Version:
TypeScript library and CLI tool for interacting with Axie Infinity marketplace and NFTs on Ronin network. Features marketplace operations (buy/sell/delist), batch transfers, and wallet information.
223 lines (211 loc) • 4.17 kB
text/typescript
import type { Wallet } from "ethers";
import {
MARKETPLACE_GATEWAY_V_2,
AXIE_PROXY,
WRAPPED_ETHER,
} from "@roninbuilders/contracts";
import { apiRequest } from "../utils";
export interface ICreateOrderData {
address: string;
axieId: string;
basePrice: string;
endedPrice: string;
startedAt: number;
endedAt: number;
expiredAt: number;
}
export interface ICreateOrderResult {
data?: {
createOrder: {
hash: string;
currentPriceUsd: string;
};
};
errors?: Array<{
message: string;
}>;
}
export default async function createMarketplaceOrder(
orderData: ICreateOrderData,
accessToken: string,
signer: Wallet,
) {
const {
address,
axieId,
basePrice,
endedPrice,
startedAt,
endedAt,
expiredAt,
} = orderData;
const types = {
Asset: [
{
name: "erc",
type: "uint8",
},
{
name: "addr",
type: "address",
},
{
name: "id",
type: "uint256",
},
{
name: "quantity",
type: "uint256",
},
],
Order: [
{
name: "maker",
type: "address",
},
{
name: "kind",
type: "uint8",
},
{
name: "assets",
type: "Asset[]",
},
{
name: "expiredAt",
type: "uint256",
},
{
name: "paymentToken",
type: "address",
},
{
name: "startedAt",
type: "uint256",
},
{
name: "basePrice",
type: "uint256",
},
{
name: "endedAt",
type: "uint256",
},
{
name: "endedPrice",
type: "uint256",
},
{
name: "expectedState",
type: "uint256",
},
{
name: "nonce",
type: "uint256",
},
{
name: "marketFeePercentage",
type: "uint256",
},
],
};
const domain = {
name: "MarketGateway",
version: "1",
chainId: "2020",
verifyingContract: MARKETPLACE_GATEWAY_V_2.address,
};
const order = {
maker: address,
kind: "1",
assets: [
{
erc: "1",
addr: AXIE_PROXY.address,
id: axieId,
quantity: "0", // ??? not sure why this is 0, maybbe its for items
},
],
expiredAt,
paymentToken: WRAPPED_ETHER.address,
startedAt,
basePrice,
endedAt,
endedPrice,
expectedState: "0",
nonce: "0", // ?? use nonce from the wallet
marketFeePercentage: "425",
};
const signature = await signer.signTypedData(domain, types, order);
const query = `
mutation CreateOrder($order: InputOrder!, $signature: String!) {
createOrder(order: $order, signature: $signature) {
...OrderInfo
__typename
}
}
fragment OrderInfo on Order {
id
maker
kind
assets {
...AssetInfo
__typename
}
expiredAt
paymentToken
startedAt
basePrice
endedAt
endedPrice
expectedState
nonce
marketFeePercentage
signature
hash
duration
timeLeft
currentPrice
suggestedPrice
currentPriceUsd
__typename
}
fragment AssetInfo on Asset {
erc
address
id
quantity
orderId
__typename
}
`;
const variables = {
order: {
nonce: 0,
assets: [
{
id: axieId,
address: AXIE_PROXY.address,
erc: "Erc721",
quantity: "0",
},
],
basePrice,
endedPrice,
startedAt,
endedAt,
expiredAt,
},
signature,
};
const graphqlUrl = "https://graphql-gateway.axieinfinity.com/graphql";
const headers: Record<string, string> = {
authorization: `Bearer ${accessToken}`,
};
const result = await apiRequest<ICreateOrderResult>(
graphqlUrl,
JSON.stringify({ query, variables }),
headers,
);
return result;
}