add erc1155 to index
This commit is contained in:
parent
e0e3a9fade
commit
57a9ad7b36
12
src/index.ts
12
src/index.ts
@ -31,6 +31,7 @@ import {
|
|||||||
} from "./manage/WalletManage";
|
} from "./manage/WalletManage";
|
||||||
import { signLogin } from "./util/sign.util";
|
import { signLogin } from "./util/sign.util";
|
||||||
import { JazzIcon } from "./comp/JazzIcon";
|
import { JazzIcon } from "./comp/JazzIcon";
|
||||||
|
import { ERC1155Standard } from "./standards/ERC1155Standard";
|
||||||
|
|
||||||
var global =
|
var global =
|
||||||
(typeof globalThis !== "undefined" && globalThis) ||
|
(typeof globalThis !== "undefined" && globalThis) ||
|
||||||
@ -49,9 +50,6 @@ declare global {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// window.Buffer = require('buffer').Buffer;
|
|
||||||
// window.process = require('process');
|
|
||||||
// window.Stream = require('stream-browserify');
|
|
||||||
|
|
||||||
export interface IChainData {
|
export interface IChainData {
|
||||||
name: string;
|
name: string;
|
||||||
@ -71,6 +69,7 @@ export default class JCWallet {
|
|||||||
private _currentChain: IChainData;
|
private _currentChain: IChainData;
|
||||||
public erc20Standard: ERC20Standard;
|
public erc20Standard: ERC20Standard;
|
||||||
public erc721Standard: ERC721Standard;
|
public erc721Standard: ERC721Standard;
|
||||||
|
public erc1155Standard: ERC1155Standard;
|
||||||
public mainHandlers = createWalletEvents();
|
public mainHandlers = createWalletEvents();
|
||||||
public data: IAccount[] = [];
|
public data: IAccount[] = [];
|
||||||
public iconType = "jazz";
|
public iconType = "jazz";
|
||||||
@ -91,6 +90,7 @@ export default class JCWallet {
|
|||||||
console.log(`init web3 cost: ${(Date.now() - start) / 1000}`);
|
console.log(`init web3 cost: ${(Date.now() - start) / 1000}`);
|
||||||
this.erc20Standard = new ERC20Standard(this.web3);
|
this.erc20Standard = new ERC20Standard(this.web3);
|
||||||
this.erc721Standard = new ERC721Standard(this.web3);
|
this.erc721Standard = new ERC721Standard(this.web3);
|
||||||
|
this.erc1155Standard = new ERC1155Standard(this.web3);
|
||||||
start = Date.now();
|
start = Date.now();
|
||||||
this.wallet = this.web3.eth.accounts.wallet.load(
|
this.wallet = this.web3.eth.accounts.wallet.load(
|
||||||
this.password,
|
this.password,
|
||||||
@ -101,10 +101,6 @@ export default class JCWallet {
|
|||||||
this.data = loadData();
|
this.data = loadData();
|
||||||
console.log(`init wallet ext data cost: ${(Date.now() - start) / 1000}`);
|
console.log(`init wallet ext data cost: ${(Date.now() - start) / 1000}`);
|
||||||
window.jc = { wallet: this };
|
window.jc = { wallet: this };
|
||||||
// window.cc = window.cc || {};
|
|
||||||
// window.cc.walletCallback = (dataStr: string) => {
|
|
||||||
// console.log('[Native CB]::' + dataStr)
|
|
||||||
// }
|
|
||||||
this.init({ chains: [322, 97], password });
|
this.init({ chains: [322, 97], password });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +133,7 @@ export default class JCWallet {
|
|||||||
this.password = password;
|
this.password = password;
|
||||||
this.wallet.clear();
|
this.wallet.clear();
|
||||||
restoreWalletByMnemonic(mnemonic, this.password);
|
restoreWalletByMnemonic(mnemonic, this.password);
|
||||||
this.createAccount();
|
return this.createAccount();
|
||||||
}
|
}
|
||||||
|
|
||||||
get currentChain() {
|
get currentChain() {
|
||||||
|
224
src/standards/ERC1155Standard.ts
Normal file
224
src/standards/ERC1155Standard.ts
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
|
||||||
|
import Web3 from 'web3';
|
||||||
|
import { abiERC1155 } from '../abis/abiERC1155';
|
||||||
|
import { timeoutFetch } from '../util/net.util';
|
||||||
|
import { getFormattedIpfsUrl } from '../util/wallet.util';
|
||||||
|
|
||||||
|
export const ERC1155 = 'ERC1155';
|
||||||
|
export const ERC1155_INTERFACE_ID = '0xd9b67a26';
|
||||||
|
export const ERC1155_METADATA_URI_INTERFACE_ID = '0x0e89341c';
|
||||||
|
export const ERC1155_TOKEN_RECEIVER_INTERFACE_ID = '0x4e2312e0';
|
||||||
|
|
||||||
|
|
||||||
|
export class ERC1155Standard {
|
||||||
|
private web3: Web3;
|
||||||
|
|
||||||
|
constructor(web3: Web3) {
|
||||||
|
this.web3 = web3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query if contract implements ERC1155 URI Metadata interface.
|
||||||
|
*
|
||||||
|
* @param address - ERC1155 asset contract address.
|
||||||
|
* @returns Promise resolving to whether the contract implements ERC1155 URI Metadata interface.
|
||||||
|
*/
|
||||||
|
contractSupportsURIMetadataInterface = async (
|
||||||
|
address: string,
|
||||||
|
): Promise<boolean> => {
|
||||||
|
return this.contractSupportsInterface(
|
||||||
|
address,
|
||||||
|
ERC1155_METADATA_URI_INTERFACE_ID,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query if contract implements ERC1155 Token Receiver interface.
|
||||||
|
*
|
||||||
|
* @param address - ERC1155 asset contract address.
|
||||||
|
* @returns Promise resolving to whether the contract implements ERC1155 Token Receiver interface.
|
||||||
|
*/
|
||||||
|
contractSupportsTokenReceiverInterface = async (
|
||||||
|
address: string,
|
||||||
|
): Promise<boolean> => {
|
||||||
|
return this.contractSupportsInterface(
|
||||||
|
address,
|
||||||
|
ERC1155_TOKEN_RECEIVER_INTERFACE_ID,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query if contract implements ERC1155 interface.
|
||||||
|
*
|
||||||
|
* @param address - ERC1155 asset contract address.
|
||||||
|
* @returns Promise resolving to whether the contract implements the base ERC1155 interface.
|
||||||
|
*/
|
||||||
|
contractSupportsBase1155Interface = async (
|
||||||
|
address: string,
|
||||||
|
): Promise<boolean> => {
|
||||||
|
return this.contractSupportsInterface(address, ERC1155_INTERFACE_ID);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query for tokenURI for a given asset.
|
||||||
|
*
|
||||||
|
* @param address - ERC1155 asset contract address.
|
||||||
|
* @param tokenId - ERC1155 asset identifier.
|
||||||
|
* @returns Promise resolving to the 'tokenURI'.
|
||||||
|
*/
|
||||||
|
getTokenURI = async (address: string, tokenId: string): Promise<string> => {
|
||||||
|
const contract = new this.web3.eth.Contract(abiERC1155, address);
|
||||||
|
return new Promise<string>((resolve, reject) => {
|
||||||
|
contract.methods.tokenURI(tokenId).call( (error: Error, result: string) => {
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query for balance of a given ERC1155 token.
|
||||||
|
*
|
||||||
|
* @param contractAddress - ERC1155 asset contract address.
|
||||||
|
* @param address - Wallet public address.
|
||||||
|
* @param tokenId - ERC1155 asset identifier.
|
||||||
|
* @returns Promise resolving to the 'balanceOf'.
|
||||||
|
*/
|
||||||
|
getBalanceOf = async (
|
||||||
|
contractAddress: string,
|
||||||
|
address: string,
|
||||||
|
tokenId: string,
|
||||||
|
): Promise<number> => {
|
||||||
|
const contract = new this.web3.eth.Contract(abiERC1155, address);
|
||||||
|
return new Promise<number>((resolve, reject) => {
|
||||||
|
contract.methods.balanceOf(address, tokenId, (error: Error, result: number) => {
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfer single ERC1155 token.
|
||||||
|
* When minting/creating tokens, the from arg MUST be set to 0x0 (i.e. zero address).
|
||||||
|
* When burning/destroying tokens, the to arg MUST be set to 0x0 (i.e. zero address).
|
||||||
|
*
|
||||||
|
* @param operator - ERC1155 token address.
|
||||||
|
* @param from - ERC1155 token holder.
|
||||||
|
* @param to - ERC1155 token recipient.
|
||||||
|
* @param id - ERC1155 token id.
|
||||||
|
* @param value - Number of tokens to be sent.
|
||||||
|
* @returns Promise resolving to the 'transferSingle'.
|
||||||
|
*/
|
||||||
|
transferSingle = async (
|
||||||
|
operator: string,
|
||||||
|
from: string,
|
||||||
|
to: string,
|
||||||
|
id: string,
|
||||||
|
value: string,
|
||||||
|
): Promise<void> => {
|
||||||
|
const contract = new this.web3.eth.Contract(abiERC1155, operator);
|
||||||
|
return new Promise<void>((resolve, reject) => {
|
||||||
|
contract.methods.transferSingle(
|
||||||
|
operator,
|
||||||
|
from,
|
||||||
|
to,
|
||||||
|
id,
|
||||||
|
value,
|
||||||
|
(error: Error, result: void) => {
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(result);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query if a contract implements an interface.
|
||||||
|
*
|
||||||
|
* @param address - ERC1155 asset contract address.
|
||||||
|
* @param interfaceId - Interface identifier.
|
||||||
|
* @returns Promise resolving to whether the contract implements `interfaceID`.
|
||||||
|
*/
|
||||||
|
private contractSupportsInterface = async (
|
||||||
|
address: string,
|
||||||
|
interfaceId: string,
|
||||||
|
): Promise<boolean> => {
|
||||||
|
const contract = new this.web3.eth.Contract(abiERC1155, address);
|
||||||
|
return new Promise<boolean>((resolve, reject) => {
|
||||||
|
contract.methods.supportsInterface(
|
||||||
|
interfaceId,
|
||||||
|
(error: Error, result: boolean) => {
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(result);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query if a contract implements an interface.
|
||||||
|
*
|
||||||
|
* @param address - Asset contract address.
|
||||||
|
* @param ipfsGateway - The user's preferred IPFS gateway.
|
||||||
|
* @param tokenId - tokenId of a given token in the contract.
|
||||||
|
* @returns Promise resolving an object containing the standard, tokenURI, symbol and name of the given contract/tokenId pair.
|
||||||
|
*/
|
||||||
|
getDetails = async (
|
||||||
|
address: string,
|
||||||
|
ipfsGateway: string,
|
||||||
|
tokenId?: string,
|
||||||
|
): Promise<{
|
||||||
|
standard: string;
|
||||||
|
tokenURI: string | undefined;
|
||||||
|
image: string | undefined;
|
||||||
|
}> => {
|
||||||
|
const isERC1155 = await this.contractSupportsBase1155Interface(address);
|
||||||
|
|
||||||
|
if (!isERC1155) {
|
||||||
|
throw new Error("This isn't a valid ERC1155 contract");
|
||||||
|
}
|
||||||
|
let tokenURI, image;
|
||||||
|
|
||||||
|
if (tokenId) {
|
||||||
|
tokenURI = await this.getTokenURI(address, tokenId);
|
||||||
|
if (tokenURI.startsWith('ipfs://')) {
|
||||||
|
tokenURI = getFormattedIpfsUrl(ipfsGateway, tokenURI, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await timeoutFetch(tokenURI);
|
||||||
|
const object = await response.json();
|
||||||
|
image = object?.image;
|
||||||
|
if (image?.startsWith('ipfs://')) {
|
||||||
|
image = getFormattedIpfsUrl(ipfsGateway, image, true);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO consider querying to the metadata to get name.
|
||||||
|
return {
|
||||||
|
standard: ERC1155,
|
||||||
|
tokenURI,
|
||||||
|
image,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user