metaplex-foundation / python-api

136 stars 86 forks source link

deploy generating generic account, not a token mint #37

Open bigbrihh opened 2 years ago

bigbrihh commented 2 years ago

running metaplex_api.deploy(api_endpoint, "<name>", "<symbol>", seller_basis_fees) I should expect a token account to be created however it ends up creating a generic account. '{"jsonrpc": "2.0", "result": "3Z9ez2QjnjgL14haPSXHkeHviYKxomC9m3hb4SmgoUZM6kQfTGYvogK7Bai5uxREEwq1d8VMKpHWbtBBUk7oRFif", "id": 2, "contract": "AMtrrdq3z36vKiUY2a6FxJ6zytgrQDQKBqB59G3zpMX5", "status": 200}' explorer https://explorer.solana.com/address/AMtrrdq3z36vKiUY2a6FxJ6zytgrQDQKBqB59G3zpMX5?cluster=devnet

In the docs the json response is '{"status": 200, "contract": "7bxe7t1aGdum8o97bkuFeeBTcbARaBn9Gbv5sBd9DZPG", "msg": "Successfully created mint 7bxe7t1aGdum8o97bkuFeeBTcbARaBn9Gbv5sBd9DZPG", "tx": "2qmiWoVi2PNeAjppe2cNbY32zZCJLXMYgdS1zRVFiKJUHE41T5b1WfaZtR2QdFJUXadrqrjbkpwRN5aG2J3KQrQx"}' with "Successfully created mint"... and explorer shows the contact as an unknown token. https://explorer.solana.com/address/7bxe7t1aGdum8o97bkuFeeBTcbARaBn9Gbv5sBd9DZPG/metadata?cluster=devnet

Any attempts to mint produce error: TypeError: 'NoneType' object is not subscriptable

mdergueche commented 2 years ago

you are right. Not sure what is the end game in this code and that was my suspicion from the begining. If you see deploy function below: def deploy(api_endpoint, source_account, name, symbol, fees):

Initalize Client

client = Client(api_endpoint)
# List non-derived accounts
mint_account = Keypair()
token_account = TOKEN_PROGRAM_ID 

the TOKEN_PROGRAM_ID is hardcoded in the class InstructionType

METADATA_PROGRAM_ID = PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s') SYSTEM_PROGRAM_ID = PublicKey('11111111111111111111111111111111') SYSVAR_RENT_PUBKEY = PublicKey('SysvarRent111111111111111111111111111111111') ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = PublicKey('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL') TOKEN_PROGRAM_ID = PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA')

is this code trying to assign all the minted contracts to the same account. My first one which I minted with real sols went to a wierd account !

bigbrihh commented 2 years ago

I am using devnet and trying to just run through their instructions in the README.md to just walk through the motions of creating an NFT.

Not sure if at some point there has been some drift between metaplex's python module and the version of solana it uses since the deploy part now returns a different json response.

nurav97 commented 2 years ago

you need to do deploy and then mint also

deploy_response = json.loads(api.deploy(api_endpoint, name, symbol, 0)) print("Deploy:", deploy_response) assert deploy_response["status"] == 200 contract = deploy_response.get("contract")

mint_to_response = json.loads(api.mint(api_endpoint, contract, address1, "https://arweave.net/1eH7bZS-6HZH4YOc8T_tGp2Rq25dlhclXJkoa6U55mM/")) print("Mint:", mint_to_response) assert mint_to_response["status"] == 200

you can see this example i have picked up from the test folder . Happy coding :(

mdergueche commented 2 years ago

I did that but it does not work. most of the users are getting the same error: TypeError: 'NoneType' object is not subscriptable

nurav97 commented 2 years ago

this issue of none type is solved in #8 . it is caused by the change in order of signers .

the PR is still pending you can clone the PR code and solve the issue

mdergueche commented 2 years ago

many thanks @DevVarunn I did the clone but with no great success. I tried afterward the following code which somehow I managed to mint once the contract (previously without even the fix you are proposing). Any help please will be more than welcome. I'm stuck to continue on my project

import base58 import json import os import time from api.metaplex_api import wallet, MetaplexAPI from cryptography.fernet import Fernet from solana.rpc.api import Client from solana.keypair import Keypair

cfg = { "PRIVATE_KEY": WALLET_PRIVATE_KEY, "PUBLIC_KEY": WALLET_PUBLIC_KEY, "DECRYPTION_KEY": SERVER_DECRYPTION_KEY } api = metaplex_api.MetaplexAPI(cfg) api_endpoint ="https://api.mainnet-beta.solana.com"

# requires a JSON file with metadata. best to publish on Arweave
divinity_json_file = "https://arweave.net/lafoms3egQiVeboVVSsgIXRH14DiyxmKLwzD_EWiKv8"
contract_name = 'test'
contract_symbol = 'test'

# deploy a contract. will return a contract key.
Balance = Client(api_endpoint).get_account_info(WALLET_PUBLIC_KEY)['result']['value']['data'][0]
result = api.deploy(api_endpoint, contract_name, contract_symbol,0)

contract_key = json.loads(result).get('contract')
print('Sleep started')
#time.sleep(30)
# conduct a mint, and send to a recipient, e.g. wallet_2
mint_res = api.mint(api_endpoint, contract_key, WALLET_PUBLIC_KEY, divinity_json_file)