Skip to content

Commit

Permalink
Feature/nft provenance (#187)
Browse files Browse the repository at this point in the history
* adding provenance functions for BSC, ETH and CELO

* adding provenance fixes

* fix package.json

* fixing build issues

* adding one and polygon integration

* changes in provenance

* adding provenance changes

* fixing lint issues

* add provenance to nft main function

* fixing lint celo nft return

* fix cashback percent mint transformations

* added read provenance function

* version upgrade

* provenance data function rename

* fixing provenance data return type

* fixing provenance transfer

* provenance fixes

Co-authored-by: Samuel Sramko <[email protected]>
  • Loading branch information
RachitGod and Samuel Sramko authored Oct 25, 2021
1 parent 9674e84 commit fd191f5
Show file tree
Hide file tree
Showing 7 changed files with 73 additions and 88 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@tatumio/tatum",
"version": "1.29.3",
"version": "1.29.4",
"description": "Tatum API client allows browsers and Node.js clients to interact with Tatum API.",
"main": "dist/src/index.js",
"repository": "https://github.com/tatumio/tatum-js",
Expand Down
26 changes: 13 additions & 13 deletions src/nft/nft.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {axios, get, post} from '../connector/tatum';
import { axios, get, post } from '../connector/tatum';
import {
CeloBurnErc721,
CeloDeployErc721,
Expand Down Expand Up @@ -27,18 +27,26 @@ import {
TronUpdateCashbackTrc721,
UpdateCashbackErc721,
} from '../model';
import {ipfsUpload} from '../storage';
import { ipfsUpload } from '../storage';
import {
sendMintBep721ProvenanceTransaction,
sendMintMultipleBep721ProvenanceTransaction,
sendMintErc721ProvenanceTransaction,
sendMintMultipleErc721ProvenanceTransaction,
sendCeloMintErc721ProvenanceTransaction,
sendCeloMintMultipleErc721ProvenanceTransaction,
sendOneMint721ProvenanceSignedTransaction,
sendOneMintMultiple721ProvenanceSignedTransaction,
sendPolygonMintErc721ProvenanceSignedTransaction,
sendPolygonMintMultipleErc721ProvenanceSignedTransaction,
sendBep721Transaction,
sendBurnBep721Transaction,
sendBurnErc721Transaction,
sendCeloBurnErc721Transaction,
sendCeloDeployErc721Transaction,
sendCeloMintCashbackErc721Transaction,
sendCeloMintErc721ProvenanceTransaction,
sendCeloMintErc721Transaction,
sendCeloMintMultipleCashbackErc721Transaction,
sendCeloMintMultipleErc721ProvenanceTransaction,
sendCeloMintMultipleErc721Transaction,
sendCeloTransferErc721Transaction,
sendCeloUpdateCashbackForAuthorErc721Transaction,
Expand All @@ -50,34 +58,26 @@ import {
sendFlowNftMintMultipleToken,
sendFlowNftMintToken,
sendFlowNftTransferToken,
sendMintBep721ProvenanceTransaction,
sendMintBep721Transaction,
sendMintBepCashback721Transaction,
sendMintCashbackErc721Transaction,
sendMintErc721ProvenanceTransaction,
sendMintErc721Transaction,
sendMintMultipleBep721ProvenanceTransaction,
sendMintMultipleBep721Transaction,
sendMintMultipleCashbackBep721Transaction,
sendMintMultipleErc721ProvenanceTransaction,
sendMintMultipleErc721Transaction,
sendOneBurn721SignedTransaction,
sendOneDeploy721SignedTransaction,
sendOneMint721ProvenanceSignedTransaction,
sendOneMint721SignedTransaction,
sendOneMintCashback721SignedTransaction,
sendOneMintMultiple721ProvenanceSignedTransaction,
sendOneMintMultiple721SignedTransaction,
sendOneMintMultipleCashback721SignedTransaction,
sendOneTransfer721SignedTransaction,
sendOneUpdateCashbackForAuthor721SignedTransaction,
sendPolygonBurnErc721SignedTransaction,
sendPolygonDeployErc721SignedTransaction,
sendPolygonMintCashbackErc721SignedTransaction,
sendPolygonMintErc721ProvenanceSignedTransaction,
sendPolygonMintErc721SignedTransaction,
sendPolygonMintMultipleCashbackErc721SignedTransaction,
sendPolygonMintMultipleErc721ProvenanceSignedTransaction,
sendPolygonMintMultipleErc721SignedTransaction,
sendPolygonTransferErc721SignedTransaction,
sendPolygonUpdateCashbackForAuthorErc721SignedTransaction,
Expand All @@ -102,7 +102,7 @@ export const getNFTsByAddress = async (chain: Currency, contractAddress: string,
/**
* For more details, see <a href="https://tatum.io/apidoc#operation/NftProvenanceReadData" target="_blank">Tatum API documentation</a>
*/
export const getNFTProvenanceData = async (chain: Currency, contractAddress: string, tokenId: string): Promise<{ ProvenanceData: string, tokenPrice: string }> =>
export const getNFTProvenanceData = async (chain: Currency, contractAddress: string, tokenId: string): Promise<any> =>
get(`/v3/nft/provenance/${chain}/${contractAddress}/${tokenId}`);

/**
Expand Down
23 changes: 10 additions & 13 deletions src/transaction/bsc.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import {BigNumber} from 'bignumber.js';
import { BigNumber } from 'bignumber.js';
import Web3 from 'web3';
import {TransactionConfig} from 'web3-core';
import {toWei} from 'web3-utils';
import {bscBroadcast, bscGetTransactionsCount} from '../blockchain';
import {validateBody} from '../connector/tatum';
import {CONTRACT_ADDRESSES, CONTRACT_DECIMALS, TATUM_API_URL, TRANSFER_METHOD_ABI} from '../constants';
import { TransactionConfig } from 'web3-core';
import { toWei } from 'web3-utils';
import { bscBroadcast, bscGetTransactionsCount } from '../blockchain';
import { validateBody } from '../connector/tatum';
import { CONTRACT_ADDRESSES, CONTRACT_DECIMALS, TATUM_API_URL, TRANSFER_METHOD_ABI } from '../constants';
import erc1155TokenABI from '../contracts/erc1155/erc1155_abi';
import erc1155TokenBytecode from '../contracts/erc1155/erc1155_bytecode';
import erc20_abi from '../contracts/erc20/token_abi';
Expand All @@ -14,7 +14,7 @@ import erc721TokenABI from '../contracts/erc721/erc721_abi';
import erc721TokenBytecode from '../contracts/erc721/erc721_bytecode';
import erc721Provenance_abi from '../contracts/erc721Provenance/erc721Provenance_abi';
import erc721Provenance_bytecode from '../contracts/erc721Provenance/erc721Provenance_bytecode';
import {auction, listing} from '../contracts/marketplace';
import { auction, listing } from '../contracts/marketplace';
import {
BurnErc20,
CreateRecord,
Expand Down Expand Up @@ -44,8 +44,8 @@ import {
TransferMultiTokenBatch,
UpdateCashbackErc721
} from '../model';
import {mintNFT} from '../nft';
import {obtainCustodialAddressType} from '../wallet';
import { mintNFT } from '../nft';
import { obtainCustodialAddressType } from '../wallet';

/**
* Estimate Gas price for the transaction.
Expand Down Expand Up @@ -701,10 +701,7 @@ export const prepareBscTransferBep721SignedTransaction = async (body: EthTransfe

// @ts-ignore
const contract = new (client).eth.Contract(provenance ? erc721Provenance_abi : erc721TokenABI, contractAddress);
let tokenData = contract.methods.safeTransfer(to.trim(), tokenId).encodeABI();
if (provenance) {
tokenData = contract.methods.safeTransfer(to.trim(), tokenId, provenanceData + '\'\'\'###\'\'\'' + toWei(tokenPrice!, 'ether')).encodeABI();
}
const tokenData = provenance ? contract.methods.safeTransfer(to.trim(), tokenId, provenanceData + '\'\'\'###\'\'\'' + toWei(tokenPrice!, 'ether')).encodeABI() : contract.methods.safeTransfer(to.trim(), tokenId).encodeABI();
const tx: TransactionConfig = {
from: 0,
to: contractAddress.trim(),
Expand Down
27 changes: 12 additions & 15 deletions src/transaction/celo.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import {CeloProvider, CeloWallet} from '@celo-tools/celo-ethers-wrapper';
import {BigNumber as BN} from '@ethersproject/bignumber';
import {BigNumber} from 'bignumber.js';
import { CeloProvider, CeloWallet } from '@celo-tools/celo-ethers-wrapper';
import { BigNumber as BN } from '@ethersproject/bignumber';
import { BigNumber } from 'bignumber.js';
import Web3 from 'web3';
import {isHex, stringToHex, toHex, toWei} from 'web3-utils';
import {celoBroadcast} from '../blockchain';
import {validateBody} from '../connector/tatum';
import {CEUR_ADDRESS_MAINNET, CEUR_ADDRESS_TESTNET, CUSD_ADDRESS_MAINNET, CUSD_ADDRESS_TESTNET, TATUM_API_URL, TRANSFER_METHOD_ABI} from '../constants';
import { isHex, stringToHex, toHex, toWei } from 'web3-utils';
import { celoBroadcast } from '../blockchain';
import { validateBody } from '../connector/tatum';
import { CEUR_ADDRESS_MAINNET, CEUR_ADDRESS_TESTNET, CUSD_ADDRESS_MAINNET, CUSD_ADDRESS_TESTNET, TATUM_API_URL, TRANSFER_METHOD_ABI } from '../constants';
import erc1155_abi from '../contracts/erc1155/erc1155_abi';
import erc1155_bytecode from '../contracts/erc1155/erc1155_bytecode';
import erc20_abi from '../contracts/erc20/token_abi';
Expand All @@ -14,7 +14,7 @@ import erc721_abi from '../contracts/erc721/erc721_abi';
import erc721_bytecode from '../contracts/erc721/erc721_bytecode';
import erc721Provenance_abi from '../contracts/erc721Provenance/erc721Provenance_abi';
import erc721Provenance_bytecode from '../contracts/erc721Provenance/erc721Provenance_bytecode';
import {auction, listing} from '../contracts/marketplace';
import { auction, listing } from '../contracts/marketplace';
import {
BurnCeloErc20,
CeloBurnErc721,
Expand Down Expand Up @@ -42,8 +42,8 @@ import {
TransactionKMS,
TransferCeloOrCeloErc20Token
} from '../model';
import {mintNFT} from '../nft';
import {obtainCustodialAddressType} from '../wallet/custodial';
import { mintNFT } from '../nft';
import { obtainCustodialAddressType } from '../wallet/custodial';

const obtainWalletInformation = async (wallet: CeloWallet, feeCurrencyContractAddress?: string) => {
const [txCount, gasPrice, from] = await Promise.all([
Expand Down Expand Up @@ -568,10 +568,7 @@ export const prepareCeloTransferErc721SignedTransaction = async (testnet: boolea

// @ts-ignore
const contract = new (new Web3()).eth.Contract(provenance ? erc721Provenance_abi : erc721_abi, contractAddress.trim());
let tokenData = contract.methods.safeTransfer(to.trim(), tokenId).encodeABI();
if (provenance) {
tokenData = contract.methods.safeTransfer(to.trim(), tokenId, provenanceData + '\'\'\'###\'\'\'' + toWei(tokenPrice!, 'ether')).encodeABI();
}
const tokenData = provenance ? contract.methods.safeTransfer(to.trim(), tokenId, provenanceData + '\'\'\'###\'\'\'' + toWei(tokenPrice!, 'ether')).encodeABI() : contract.methods.safeTransfer(to.trim(), tokenId).encodeABI();
if (signatureId) {
return JSON.stringify({
chainId: network.chainId,
Expand Down Expand Up @@ -1625,7 +1622,7 @@ export const sendCeloMintCashbackErc721Transaction = async (testnet: boolean, bo
* @param provider url of the Celo Server to connect to. If not set, default public server will be used.
* @returns transaction id of the transaction in the blockchain
*/
export const sendCeloMintErc721ProvenanceTransaction = async (testnet: boolean, body: CeloMintErc721, provider?: string) =>{
export const sendCeloMintErc721ProvenanceTransaction = async (testnet: boolean, body: CeloMintErc721, provider?: string) => {
if (!body.fromPrivateKey) {
return mintNFT(body)
}
Expand Down
31 changes: 14 additions & 17 deletions src/transaction/eth.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import {BigNumber} from 'bignumber.js';
import { BigNumber } from 'bignumber.js';
import Web3 from 'web3';
import {TransactionConfig} from 'web3-core';
import {toWei} from 'web3-utils';
import {ethBroadcast, ethGetTransactionsCount} from '../blockchain';
import {axios, validateBody} from '../connector/tatum';
import {CONTRACT_ADDRESSES, CONTRACT_DECIMALS, TATUM_API_URL, TRANSFER_METHOD_ABI} from '../constants';
import { TransactionConfig } from 'web3-core';
import { toWei } from 'web3-utils';
import { ethBroadcast, ethGetTransactionsCount } from '../blockchain';
import { axios, validateBody } from '../connector/tatum';
import { CONTRACT_ADDRESSES, CONTRACT_DECIMALS, TATUM_API_URL, TRANSFER_METHOD_ABI } from '../constants';
import erc1155TokenABI from '../contracts/erc1155/erc1155_abi';
import erc1155TokenBytecode from '../contracts/erc1155/erc1155_bytecode';
import erc20_abi from '../contracts/erc20/token_abi';
Expand All @@ -14,7 +14,7 @@ import erc721TokenABI from '../contracts/erc721/erc721_abi';
import erc721TokenBytecode from '../contracts/erc721/erc721_bytecode';
import erc721Provenance_abi from '../contracts/erc721Provenance/erc721Provenance_abi';
import erc721Provenance_bytecode from '../contracts/erc721Provenance/erc721Provenance_bytecode';
import {auction, listing} from '../contracts/marketplace';
import { auction, listing } from '../contracts/marketplace';
import {
BurnErc20,
CreateRecord,
Expand Down Expand Up @@ -43,8 +43,8 @@ import {
TransferMultiTokenBatch,
UpdateCashbackErc721,
} from '../model';
import {mintNFT} from '../nft';
import {obtainCustodialAddressType} from '../wallet';
import { mintNFT } from '../nft';
import { obtainCustodialAddressType } from '../wallet';

/**
* Estimate Gas price for the transaction.
Expand Down Expand Up @@ -478,10 +478,10 @@ export const prepareEthMintErc721ProvenanceSignedTransaction = async (body: EthM
const contract = new (client).eth.Contract(erc721Provenance_abi, contractAddress)
const cb: string[] = []
const fv: string[] = []
if (cashbackValues && fixedValues && authorAddresses) {
cashbackValues.map(c => cb.push(`0x${new BigNumber(c).multipliedBy(100).toString(16)}`));
fixedValues.map(c => fv.push(`0x${new BigNumber(toWei(c, 'ether')).toString(16)}`));
}
if (cashbackValues && fixedValues && authorAddresses) {
cashbackValues.map(c => cb.push(`0x${new BigNumber(c).multipliedBy(100).toString(16)}`));
fixedValues.map(c => fv.push(`0x${new BigNumber(toWei(c, 'ether')).toString(16)}`));
}
const data = contract.methods.mintWithTokenURI(to.trim(), tokenId, url, authorAddresses ? authorAddresses : [], cb, fv).encodeABI();
if (contractAddress) {
const tx: TransactionConfig = {
Expand Down Expand Up @@ -770,10 +770,7 @@ export const prepareEthTransferErc721SignedTransaction = async (body: EthTransfe

// @ts-ignore
const contract = new (client).eth.Contract(provenance ? erc721Provenance_abi : erc721TokenABI, contractAddress);
let tokenData = contract.methods.safeTransfer(to.trim(), tokenId).encodeABI();
if (provenance) {
tokenData = contract.methods.safeTransfer(to.trim(), tokenId, provenanceData + '\'\'\'###\'\'\'' + toWei(tokenPrice!, 'ether')).encodeABI();
}
const tokenData = provenance ? contract.methods.safeTransfer(to.trim(), tokenId, provenanceData + '\'\'\'###\'\'\'' + toWei(tokenPrice!, 'ether')).encodeABI() : contract.methods.safeTransfer(to.trim(), tokenId).encodeABI();
const tx: TransactionConfig = {
from: 0,
to: contractAddress.trim(),
Expand Down
27 changes: 12 additions & 15 deletions src/transaction/one.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import {HarmonyAddress} from '@harmony-js/crypto';
import {BigNumber} from 'bignumber.js';
import { HarmonyAddress } from '@harmony-js/crypto';
import { BigNumber } from 'bignumber.js';
import Web3 from 'web3';
import {TransactionConfig} from 'web3-core';
import {toWei} from 'web3-utils';
import {oneBroadcast} from '../blockchain';
import {validateBody} from '../connector/tatum';
import {TATUM_API_URL} from '../constants';
import { TransactionConfig } from 'web3-core';
import { toWei } from 'web3-utils';
import { oneBroadcast } from '../blockchain';
import { validateBody } from '../connector/tatum';
import { TATUM_API_URL } from '../constants';
import erc1155TokenABI from '../contracts/erc1155/erc1155_abi';
import erc1155TokenBytecode from '../contracts/erc1155/erc1155_bytecode';
import erc20_abi from '../contracts/erc20/token_abi';
Expand All @@ -15,7 +15,7 @@ import erc721TokenABI from '../contracts/erc721/erc721_abi';
import erc721TokenBytecode from '../contracts/erc721/erc721_bytecode';
import erc721Provenance_abi from '../contracts/erc721Provenance/erc721Provenance_abi';
import erc721Provenance_bytecode from '../contracts/erc721Provenance/erc721Provenance_bytecode';
import {auction, listing} from '../contracts/marketplace';
import { auction, listing } from '../contracts/marketplace';
import {
CreateRecord,
Currency,
Expand Down Expand Up @@ -44,11 +44,11 @@ import {
SmartContractReadMethodInvocation,
TransactionKMS,
} from '../model';
import {mintNFT} from '../nft';
import {obtainCustodialAddressType} from '../wallet';
import { mintNFT } from '../nft';
import { obtainCustodialAddressType } from '../wallet';

const prepareGeneralTx = async (client: Web3, testnet: boolean, fromPrivateKey?: string, signatureId?: string, to?: string, amount?: string, nonce?: number,
data?: string, gasLimit?: string, gasPrice?: string) => {
data?: string, gasLimit?: string, gasPrice?: string) => {
const recipient = to?.includes('one') ? new HarmonyAddress(to).basicHex : to;
const tx: TransactionConfig = {
from: 0,
Expand Down Expand Up @@ -460,10 +460,7 @@ export const prepareOneTransfer721SignedTransaction = async (testnet: boolean, b
const client = await prepareOneClient(testnet, provider, body.fromPrivateKey);
// @ts-ignore
const contract = new (client).eth.Contract(body.provenance ? erc721Provenance_abi : erc721TokenABI, new HarmonyAddress(body.contractAddress).basicHex);
let data = contract.methods.safeTransfer(new HarmonyAddress(body.to).basicHex, body.tokenId).encodeABI();
if (body.provenance) {
data = contract.methods.safeTransfer(new HarmonyAddress(body.to).basicHex, body.tokenId, body.provenanceData + '\'\'\'###\'\'\'' + toWei(body.tokenPrice!, 'ether')).encodeABI();
}
const data = body.provenance ? contract.methods.safeTransfer(new HarmonyAddress(body.to).basicHex, body.tokenId, body.provenanceData + '\'\'\'###\'\'\'' + toWei(body.tokenPrice!, 'ether')).encodeABI() : contract.methods.safeTransfer(new HarmonyAddress(body.to).basicHex, body.tokenId).encodeABI();
return prepareGeneralTx(client, testnet, body.fromPrivateKey, body.signatureId, new HarmonyAddress(body.contractAddress).basicHex, body.value, body.nonce, data,
body.fee?.gasLimit, body.fee?.gasPrice);
}
Expand Down
25 changes: 11 additions & 14 deletions src/transaction/polygon.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import {BigNumber} from 'bignumber.js';
import { BigNumber } from 'bignumber.js';
import Web3 from 'web3';
import {TransactionConfig} from 'web3-core';
import {isHex, stringToHex, toHex, toWei} from 'web3-utils';
import {polygonBroadcast} from '../blockchain';
import {axios, validateBody} from '../connector/tatum';
import {CONTRACT_ADDRESSES, CONTRACT_DECIMALS, TATUM_API_URL, TRANSFER_METHOD_ABI} from '../constants';
import { TransactionConfig } from 'web3-core';
import { isHex, stringToHex, toHex, toWei } from 'web3-utils';
import { polygonBroadcast } from '../blockchain';
import { axios, validateBody } from '../connector/tatum';
import { CONTRACT_ADDRESSES, CONTRACT_DECIMALS, TATUM_API_URL, TRANSFER_METHOD_ABI } from '../constants';
import erc1155TokenABI from '../contracts/erc1155/erc1155_abi';
import erc1155TokenBytecode from '../contracts/erc1155/erc1155_bytecode';
import erc20_abi from '../contracts/erc20/token_abi';
Expand All @@ -14,7 +14,7 @@ import erc721TokenABI from '../contracts/erc721/erc721_abi';
import erc721TokenBytecode from '../contracts/erc721/erc721_bytecode';
import erc721Provenance_abi from '../contracts/erc721Provenance/erc721Provenance_abi';
import erc721Provenance_bytecode from '../contracts/erc721Provenance/erc721Provenance_bytecode';
import {auction, listing} from '../contracts/marketplace';
import { auction, listing } from '../contracts/marketplace';
import {
BurnErc20,
BurnMultiToken,
Expand Down Expand Up @@ -44,14 +44,14 @@ import {
TransferMultiTokenBatch,
UpdateCashbackErc721,
} from '../model';
import {mintNFT} from '../nft';
import {obtainCustodialAddressType} from '../wallet';
import { mintNFT } from '../nft';
import { obtainCustodialAddressType } from '../wallet';

/**
* Estimate Gas price for the transaction.
*/
export const polygonGetGasPriceInWei = async () => {
const {data} = await axios.get('https://gasstation-mainnet.matic.network');
const { data } = await axios.get('https://gasstation-mainnet.matic.network');
return Web3.utils.toWei(`${Math.max(30, Math.min(Math.ceil(data.fast / 10), 100))}`, 'gwei');
};

Expand Down Expand Up @@ -433,10 +433,7 @@ export const preparePolygonTransferErc721SignedTransaction = async (testnet: boo
const client = await preparePolygonClient(testnet, provider, body.fromPrivateKey);
// @ts-ignore
const contract = new (client).eth.Contract(body.provenance ? erc721Provenance_abi : erc721TokenABI, body.contractAddress.trim());
let data = contract.methods.safeTransfer(body.to.trim(), body.tokenId).encodeABI();
if (body.provenance) {
data = contract.methods.safeTransfer(body.to.trim(), body.tokenId, body.provenanceData + '\'\'\'###\'\'\'' + toWei(body.tokenPrice!, 'ether')).encodeABI();
}
const data = body.provenance ? contract.methods.safeTransfer(body.to.trim(), body.tokenId, body.provenanceData + '\'\'\'###\'\'\'' + toWei(body.tokenPrice!, 'ether')).encodeABI() : contract.methods.safeTransfer(body.to.trim(), body.tokenId).encodeABI();
return prepareGeneralTx(client, testnet, body.fromPrivateKey, body.signatureId, body.contractAddress.trim(), body.value, body.nonce, data,
body.fee?.gasLimit, body.fee?.gasPrice);
}
Expand Down

0 comments on commit fd191f5

Please sign in to comment.