You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

718 lines
14 KiB
Python

from os import getenv
from dotenv import load_dotenv
load_dotenv()
# App
SECRET_KEY = getenv('SECRET_KEY', 'yyyyyyyyyyyyy')
DATA_FOLDER = getenv('DATA_FOLDER', '/path/to/uploads')
SERVER_NAME = getenv('SERVER_NAME', '127.0.0.1:5000')
IPFS_SERVER = getenv('IPFS_SERVER', 'http://127.0.0.1:8080')
AVAX_RPC = getenv('AVAX_RPC', 'https://api.avax-test.network/ext/bc/C/rpc')
# Cache
CACHE_HOST = getenv('CACHE_HOST', 'localhost')
CACHE_PORT = getenv('CACHE_PORT', 6379)
# Uploads
SESSION_TYPE = 'filesystem'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'svg', 'mp4', 'webp'}
MAX_CONTENT_LENGTH = 32 * 1024 * 1024
TEMPLATES_AUTO_RELOAD = getenv('TEMPLATES_AUTO_RELOAD', True)
# Contract
CONTRACT_TESTNET = getenv('TESTNET', True)
CONTRACT_ADDRESS = '0x9797afc5d0258704109f71109188fdcba19c24c2' # Fuji
CONTRACT_ABI = [
{
'inputs': [],
'stateMutability': 'nonpayable',
'type': 'constructor'
},
{
'anonymous': False,
'inputs': [
{
'indexed': True,
'internalType': 'address',
'name': 'owner',
'type': 'address'
},
{
'indexed': True,
'internalType': 'address',
'name': 'approved',
'type': 'address'
},
{
'indexed': True,
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
}
],
'name': 'Approval',
'type': 'event'
},
{
'anonymous': False,
'inputs': [
{
'indexed': True,
'internalType': 'address',
'name': 'owner',
'type': 'address'
},
{
'indexed': True,
'internalType': 'address',
'name': 'operator',
'type': 'address'
},
{
'indexed': False,
'internalType': 'bool',
'name': 'approved',
'type': 'bool'
}
],
'name': 'ApprovalForAll',
'type': 'event'
},
{
'anonymous': False,
'inputs': [
{
'indexed': True,
'internalType': 'address',
'name': 'previousOwner',
'type': 'address'
},
{
'indexed': True,
'internalType': 'address',
'name': 'newOwner',
'type': 'address'
}
],
'name': 'OwnershipTransferred',
'type': 'event'
},
{
'anonymous': False,
'inputs': [
{
'indexed': True,
'internalType': 'address',
'name': 'from',
'type': 'address'
},
{
'indexed': True,
'internalType': 'address',
'name': 'to',
'type': 'address'
},
{
'indexed': True,
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
}
],
'name': 'Transfer',
'type': 'event'
},
{
'inputs': [
{
'internalType': 'address',
'name': 'to',
'type': 'address'
},
{
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
}
],
'name': 'approve',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'address',
'name': 'owner',
'type': 'address'
}
],
'name': 'balanceOf',
'outputs': [
{
'internalType': 'uint256',
'name': '',
'type': 'uint256'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [],
'name': 'contractCreator',
'outputs': [
{
'internalType': 'string',
'name': '',
'type': 'string'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [],
'name': 'contractTipCutPercent',
'outputs': [
{
'internalType': 'uint256',
'name': '',
'type': 'uint256'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [],
'name': 'contractVersion',
'outputs': [
{
'internalType': 'string',
'name': '',
'type': 'string'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
}
],
'name': 'getApproved',
'outputs': [
{
'internalType': 'address',
'name': '',
'type': 'address'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'address',
'name': 'owner',
'type': 'address'
},
{
'internalType': 'address',
'name': 'operator',
'type': 'address'
}
],
'name': 'isApprovedForAll',
'outputs': [
{
'internalType': 'bool',
'name': '',
'type': 'bool'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'string',
'name': '',
'type': 'string'
}
],
'name': 'metadataTokenId',
'outputs': [
{
'internalType': 'uint256',
'name': '',
'type': 'uint256'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [],
'name': 'name',
'outputs': [
{
'internalType': 'string',
'name': '',
'type': 'string'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [],
'name': 'owner',
'outputs': [
{
'internalType': 'address',
'name': '',
'type': 'address'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
}
],
'name': 'ownerOf',
'outputs': [
{
'internalType': 'address',
'name': '',
'type': 'address'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [],
'name': 'publisherTipCutPercent',
'outputs': [
{
'internalType': 'uint256',
'name': '',
'type': 'uint256'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [],
'name': 'renounceOwnership',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'address',
'name': 'from',
'type': 'address'
},
{
'internalType': 'address',
'name': 'to',
'type': 'address'
},
{
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
}
],
'name': 'safeTransferFrom',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'address',
'name': 'from',
'type': 'address'
},
{
'internalType': 'address',
'name': 'to',
'type': 'address'
},
{
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
},
{
'internalType': 'bytes',
'name': '_data',
'type': 'bytes'
}
],
'name': 'safeTransferFrom',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'address',
'name': 'operator',
'type': 'address'
},
{
'internalType': 'bool',
'name': 'approved',
'type': 'bool'
}
],
'name': 'setApprovalForAll',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'bytes4',
'name': 'interfaceId',
'type': 'bytes4'
}
],
'name': 'supportsInterface',
'outputs': [
{
'internalType': 'bool',
'name': '',
'type': 'bool'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [],
'name': 'symbol',
'outputs': [
{
'internalType': 'string',
'name': '',
'type': 'string'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'uint256',
'name': '',
'type': 'uint256'
}
],
'name': 'tokenMeme',
'outputs': [
{
'internalType': 'uint256',
'name': 'publisherTipsAVAX',
'type': 'uint256'
},
{
'internalType': 'uint256',
'name': 'creatorTipsAVAX',
'type': 'uint256'
},
{
'internalType': 'uint256',
'name': 'contractTipsAVAX',
'type': 'uint256'
},
{
'internalType': 'address',
'name': 'publisherAddress',
'type': 'address'
},
{
'internalType': 'address',
'name': 'creatorAddress',
'type': 'address'
},
{
'internalType': 'string',
'name': 'metadataIPFSHash',
'type': 'string'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'address',
'name': 'from',
'type': 'address'
},
{
'internalType': 'address',
'name': 'to',
'type': 'address'
},
{
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
}
],
'name': 'transferFrom',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'address',
'name': 'newOwner',
'type': 'address'
}
],
'name': 'transferOwnership',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'address',
'name': '',
'type': 'address'
}
],
'name': 'userProfile',
'outputs': [
{
'internalType': 'string',
'name': 'wowneroAddress',
'type': 'string'
},
{
'internalType': 'string',
'name': 'userHandle',
'type': 'string'
},
{
'internalType': 'string',
'name': 'metadataIPFSHash',
'type': 'string'
},
{
'internalType': 'uint256',
'name': 'tippedAVAX',
'type': 'uint256'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [],
'name': 'withdraw',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'uint256',
'name': 'percent',
'type': 'uint256'
}
],
'name': 'setContractTipCut',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'uint256',
'name': 'percent',
'type': 'uint256'
}
],
'name': 'setPublisherTipCut',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [],
'name': 'totalSupply',
'outputs': [
{
'internalType': 'uint256',
'name': '',
'type': 'uint256'
}
],
'stateMutability': 'view',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'string',
'name': 'wowneroAddress',
'type': 'string'
}
],
'name': 'setUserWowneroAddress',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'string',
'name': 'handle',
'type': 'string'
}
],
'name': 'setUserHandle',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'string',
'name': 'metadataIPFSHash',
'type': 'string'
}
],
'name': 'setUserMetadata',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'string',
'name': 'metadataIPFSHash',
'type': 'string'
},
{
'internalType': 'address',
'name': 'creatorAddress',
'type': 'address'
}
],
'name': 'mint',
'outputs': [],
'stateMutability': 'nonpayable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
}
],
'name': 'tipAVAX',
'outputs': [],
'stateMutability': 'payable',
'type': 'function'
},
{
'inputs': [
{
'internalType': 'uint256',
'name': 'tokenId',
'type': 'uint256'
}
],
'name': 'tokenURI',
'outputs': [
{
'internalType': 'string',
'name': '',
'type': 'string'
}
],
'stateMutability': 'view',
'type': 'function'
}
]
# Logging
LOGGING_CONFIG = {
'version': 1,
'formatters': {'default': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
}},
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'default',
'stream': 'ext://sys.stdout',
},
'wsgi': {
'class': 'logging.StreamHandler',
'stream': 'ext://flask.logging.wsgi_errors_stream',
'formatter': 'default'
}
},
'loggers': {
'gunicorn.error': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
'gunicorn.access': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
}
},
'root': {
'level': 'DEBUG',
'handlers': ['console'],
}
}