fix(@desktop/communities): Tracking airdrop transaction

Fix #10161
This commit is contained in:
Michal Iskierko 2023-04-04 16:11:14 +02:00 committed by Michał Iskierko
parent 57425e77bd
commit 3e550bf9a5
5 changed files with 71 additions and 5 deletions

View File

@ -0,0 +1,29 @@
import json
include ../../common/json_utils
type
AirdropDetails* = object
chainId*: int
contractAddress*: string
walletAddresses*: seq[string]
amount*: int
proc toJsonNode*(self: AirdropDetails): JsonNode =
result = %* {
"chainId": self.chainId,
"contractAddress": self.contractAddress,
"walletAddresses": self.walletAddresses,
"amount": self.amount
}
proc toAirdropDetails*(jsonObj: JsonNode): AirdropDetails =
result = AirdropDetails()
discard jsonObj.getProp("chainId", result.chainId)
discard jsonObj.getProp("contractAddress", result.contractAddress)
var walletsObj: JsonNode
if(jsonObj.getProp("walletAddresses", walletsObj) and walletsObj.kind == JArray):
for walletAddr in walletsObj:
result.walletAddresses.add(walletAddr.getStr)
discard jsonObj.getProp("amount", result.amount)

View File

@ -1,4 +1,4 @@
import json, json, sequtils import json, sequtils
import ../../../../backend/response_type import ../../../../backend/response_type
include ../../../common/json_utils include ../../../common/json_utils
import ../../../common/conversion import ../../../common/conversion

View File

@ -18,6 +18,8 @@ import ../community/dto/community
import ./dto/deployment_parameters import ./dto/deployment_parameters
import ./dto/community_token import ./dto/community_token
import ./airdrop_details
include async_tasks include async_tasks
export community_token export community_token
@ -105,6 +107,19 @@ QtObject:
let data = CommunityTokenDeployedStatusArgs(communityId: tokenDto.communityId, contractAddress: tokenDto.address, deployState: deployState) let data = CommunityTokenDeployedStatusArgs(communityId: tokenDto.communityId, contractAddress: tokenDto.address, deployState: deployState)
self.events.emit(SIGNAL_COMMUNITY_TOKEN_DEPLOY_STATUS, data) self.events.emit(SIGNAL_COMMUNITY_TOKEN_DEPLOY_STATUS, data)
self.events.on(PendingTransactionTypeDto.CollectibleAirdrop.event) do(e: Args):
var receivedData = TransactionMinedArgs(e)
let airdropDetails = toAirdropDetails(parseJson(receivedData.data))
if not receivedData.success:
error "Collectible airdrop failed", contractAddress=airdropDetails.contractAddress
return
try:
# add holders to db
discard addTokenOwners(airdropDetails.chainId, airdropDetails.contractAddress,
airdropDetails.walletAddresses, airdropDetails.amount)
except RpcException:
error "Error adding collectible token owners", message = getCurrentExceptionMsg()
proc deployCollectiblesEstimate*(self: Service): int = proc deployCollectiblesEstimate*(self: Service): int =
try: try:
let response = tokens_backend.deployCollectiblesEstimate() let response = tokens_backend.deployCollectiblesEstimate()
@ -129,8 +144,8 @@ QtObject:
let response = tokens_backend.deployCollectibles(chainId, %deploymentParams, %txData, password) let response = tokens_backend.deployCollectibles(chainId, %deploymentParams, %txData, password)
let contractAddress = response.result["contractAddress"].getStr() let contractAddress = response.result["contractAddress"].getStr()
let transactionHash = response.result["transactionHash"].getStr() let transactionHash = response.result["transactionHash"].getStr()
echo "!!! Contract address ", contractAddress debug "Deployed contract address ", contractAddress=contractAddress
echo "!!! Transaction hash ", transactionHash debug "Deployment transaction hash ", transactionHash=transactionHash
var communityToken: CommunityTokenDto var communityToken: CommunityTokenDto
communityToken.tokenType = TokenType.ERC721 communityToken.tokenType = TokenType.ERC721
@ -193,7 +208,24 @@ QtObject:
let addressFrom = self.contractOwner(collectibleAndAmount.communityToken.chainId, collectibleAndAmount.communityToken.address) let addressFrom = self.contractOwner(collectibleAndAmount.communityToken.chainId, collectibleAndAmount.communityToken.address)
let txData = TransactionDataDto(source: parseAddress(addressFrom)) #TODO estimate fee in UI let txData = TransactionDataDto(source: parseAddress(addressFrom)) #TODO estimate fee in UI
let response = tokens_backend.mintTo(collectibleAndAmount.communityToken.chainId, collectibleAndAmount.communityToken.address, %txData, password, walletAddresses, collectibleAndAmount.amount) let response = tokens_backend.mintTo(collectibleAndAmount.communityToken.chainId, collectibleAndAmount.communityToken.address, %txData, password, walletAddresses, collectibleAndAmount.amount)
echo "!!! Transaction hash ", response.result.getStr() let transactionHash = response.result.getStr()
debug "Deployment transaction hash ", transactionHash=transactionHash
let airdropDetails = AirdropDetails(
chainId: collectibleAndAmount.communityToken.chainId,
contractAddress: collectibleAndAmount.communityToken.address,
walletAddresses: walletAddresses,
amount: collectibleAndAmount.amount)
# observe transaction state
self.transactionService.watchTransaction(
transactionHash,
addressFrom,
collectibleAndAmount.communityToken.address,
$PendingTransactionTypeDto.CollectibleAirdrop,
$airdropDetails.toJsonNode(),
collectibleAndAmount.communityToken.chainId,
)
except RpcException: except RpcException:
error "Error minting collectibles", message = getCurrentExceptionMsg() error "Error minting collectibles", message = getCurrentExceptionMsg()

View File

@ -16,6 +16,7 @@ type
BuyStickerPack = "BuyStickerPack" BuyStickerPack = "BuyStickerPack"
WalletTransfer = "WalletTransfer" WalletTransfer = "WalletTransfer"
CollectibleDeployment = "CollectibleDeployment" CollectibleDeployment = "CollectibleDeployment"
CollectibleAirdrop = "CollectibleAirdrop"
proc event*(self:PendingTransactionTypeDto):string = proc event*(self:PendingTransactionTypeDto):string =
result = "transaction:" & $self result = "transaction:" & $self

View File

@ -30,4 +30,8 @@ proc contractOwner*(chainId: int, contractAddress: string): RpcResponse[JsonNode
proc deployCollectiblesEstimate*(): RpcResponse[JsonNode] {.raises: [Exception].} = proc deployCollectiblesEstimate*(): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %*[] let payload = %*[]
return core.callPrivateRPC("collectibles_deployCollectiblesEstimate", payload) return core.callPrivateRPC("collectibles_deployCollectiblesEstimate", payload)
proc addTokenOwners*(chainId: int, contractAddress: string, walletAddresses: seq[string], amount: int): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [chainId, contractAddress, walletAddresses, amount]
return core.callPrivateRPC("collectibles_addTokenOwners", payload)