Skip to content

Commit

Permalink
refactor: improve array methods
Browse files Browse the repository at this point in the history
  • Loading branch information
hugocaillard committed Oct 19, 2022
1 parent 3bc5c51 commit de04217
Show file tree
Hide file tree
Showing 2 changed files with 173 additions and 152 deletions.
277 changes: 125 additions & 152 deletions components/clarinet-deno/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
// deno-lint-ignore-file prefer-const ban-ts-comment no-explicit-any no-namespace

import {
ExpectFungibleTokenBurnEvent,
ExpectFungibleTokenMintEvent,
ExpectFungibleTokenTransferEvent,
ExpectNonFungibleTokenBurnEvent,
ExpectNonFungibleTokenMintEvent,
ExpectNonFungibleTokenTransferEvent,
ExpectPrintEvent,
ExpectSTXTransferEvent,
} from "./types.ts";

export * from "./types.ts";

export class Tx {
type: number;
sender: string;
Expand Down Expand Up @@ -427,46 +440,46 @@ declare global {
amount: number | bigint,
sender: string,
recipient: string
): Record<string, unknown>;
): ExpectSTXTransferEvent;
expectFungibleTokenTransferEvent(
amount: number | bigint,
sender: string,
recipient: string,
assetId: string
): Record<string, unknown>;
): ExpectFungibleTokenTransferEvent;
expectFungibleTokenMintEvent(
amount: number | bigint,
recipient: string,
assetId: string
): Record<string, unknown>;
): ExpectFungibleTokenMintEvent;
expectFungibleTokenBurnEvent(
amount: number | bigint,
sender: string,
assetId: string
): Record<string, unknown>;
): ExpectFungibleTokenBurnEvent;
expectPrintEvent(
contract_identifier: string,
contractIdentifier: string,
value: string
): Record<string, unknown>;
): ExpectPrintEvent;
expectNonFungibleTokenTransferEvent(
tokenId: string,
sender: string,
recipient: string,
assetAddress: string,
assetId: string
): Record<string, unknown>;
): ExpectNonFungibleTokenTransferEvent;
expectNonFungibleTokenMintEvent(
tokenId: string,
recipient: string,
assetAddress: string,
assetId: string
): Record<string, unknown>;
): ExpectNonFungibleTokenMintEvent;
expectNonFungibleTokenBurnEvent(
tokenId: string,
sender: string,
assetAddress: string,
assetId: string
): Record<string, unknown>;
): ExpectNonFungibleTokenBurnEvent;
}
}

Expand Down Expand Up @@ -665,45 +678,37 @@ String.prototype.expectTuple = function () {
return tuple;
};

Array.prototype.expectSTXTransferEvent = function (
amount: number | bigint,
sender: string,
recipient: string
) {
for (let event of this) {
Array.prototype.expectSTXTransferEvent = function (amount, sender, recipient) {
for (let { stx_transfer_event } of this) {
try {
let e: any = {};
e.amount = event.stx_transfer_event.amount.expectInt(amount);
e.sender = event.stx_transfer_event.sender.expectPrincipal(sender);
e.recipient =
event.stx_transfer_event.recipient.expectPrincipal(recipient);
return e;
return {
amount: stx_transfer_event.amount.expectInt(amount),
sender: stx_transfer_event.sender.expectPrincipal(sender),
recipient: stx_transfer_event.recipient.expectPrincipal(recipient),
};
} catch (_error) {
continue;
}
}
throw new Error(`Unable to retrieve expected STXTransferEvent`);
throw new Error("Unable to retrieve expected STXTransferEvent");
};

Array.prototype.expectFungibleTokenTransferEvent = function (
amount: number,
sender: string,
recipient: string,
assetId: string
amount,
sender,
recipient,
assetId
) {
for (let event of this) {
for (let { ft_transfer_event } of this) {
try {
let e: any = {};
e.amount = event.ft_transfer_event.amount.expectInt(amount);
e.sender = event.ft_transfer_event.sender.expectPrincipal(sender);
e.recipient =
event.ft_transfer_event.recipient.expectPrincipal(recipient);
if (event.ft_transfer_event.asset_identifier.endsWith(assetId)) {
e.assetId = event.ft_transfer_event.asset_identifier;
} else {
continue;
}
return e;
if (!ft_transfer_event.asset_identifier.endsWith(assetId)) continue;

return {
amount: ft_transfer_event.amount.expectInt(amount),
sender: ft_transfer_event.sender.expectPrincipal(sender),
recipient: ft_transfer_event.recipient.expectPrincipal(recipient),
assetId: ft_transfer_event.asset_identifier,
};
} catch (_error) {
continue;
}
Expand All @@ -716,175 +721,143 @@ Array.prototype.expectFungibleTokenTransferEvent = function (
};

Array.prototype.expectFungibleTokenMintEvent = function (
amount: number | bigint,
recipient: string,
assetId: string
amount,
recipient,
assetId
) {
for (let event of this) {
for (let { ft_mint_event } of this) {
try {
let e: any = {};
e.amount = event.ft_mint_event.amount.expectInt(amount);
e.recipient = event.ft_mint_event.recipient.expectPrincipal(recipient);
if (event.ft_mint_event.asset_identifier.endsWith(assetId)) {
e.assetId = event.ft_mint_event.asset_identifier;
} else {
continue;
}
return e;
if (!ft_mint_event.asset_identifier.endsWith(assetId)) continue;

return {
amount: ft_mint_event.amount.expectInt(amount),
recipient: ft_mint_event.recipient.expectPrincipal(recipient),
assetId: ft_mint_event.asset_identifier,
};
} catch (_error) {
continue;
}
}
throw new Error(`Unable to retrieve expected FungibleTokenMintEvent`);
throw new Error("Unable to retrieve expected FungibleTokenMintEvent");
};

Array.prototype.expectFungibleTokenBurnEvent = function (
amount: number | bigint,
sender: string,
assetId: string
amount,
sender,
assetId
) {
for (let event of this) {
for (let { ft_burn_event } of this) {
try {
let e: any = {};
e.amount = event.ft_burn_event.amount.expectInt(amount);
e.sender = event.ft_burn_event.sender.expectPrincipal(sender);
if (event.ft_burn_event.asset_identifier.endsWith(assetId)) {
e.assetId = event.ft_burn_event.asset_identifier;
} else {
continue;
}
return e;
if (!ft_burn_event.asset_identifier.endsWith(assetId)) continue;

return {
amount: ft_burn_event.amount.expectInt(amount),
sender: ft_burn_event.sender.expectPrincipal(sender),
assetId: ft_burn_event.asset_identifier,
};
} catch (_error) {
continue;
}
}
throw new Error(`Unable to retrieve expected FungibleTokenBurnEvent`);
throw new Error("Unable to retrieve expected FungibleTokenBurnEvent");
};

Array.prototype.expectPrintEvent = function (
contract_identifier: string,
value: string
) {
for (let event of this) {
Array.prototype.expectPrintEvent = function (contractIdentifier, value) {
for (let { contract_event } of this) {

This comment has been minimized.

Copy link
@moodmosaic

moodmosaic Nov 7, 2022

Contributor

As part of #398 that @Hookyns and I are working on, I was just running the fuzzer in various test-suites. One of them is citycoins/protocol.

This change appears to be a breaking one as it assumes that this contains only contract_event but that's not always the case:

[
  {
    type: "stx_transfer_event",
    stx_transfer_event: {
      sender: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",
      recipient: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.ccd002-treasury",
      amount: "1000",
      memo: ""
    }
  },
  {
    type: "contract_event",
    contract_event: {
      contract_identifier: "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.ccd002-treasury",
      topic: "print",
      value: '{amount: u1000, caller: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM, event: "deposit-stx", recipient: ...'
    }
  }
]

Perhaps it makes sense to explicitly select the contract_events, e.g.:

@@ -848,11 +848,11 @@ Array.prototype.expectFungibleTokenBurnEvent = function (
   }
   throw new Error("Unable to retrieve expected FungibleTokenBurnEvent");
 };
 
 Array.prototype.expectPrintEvent = function (contractIdentifier, value) {
-  for (const { contract_event } of this) {
+  for (const { contract_event } of this.filter(x =>  x.type.toLowerCase() === "contract_event")) {
     try {
       if (!contract_event.topic.endsWith("print")) continue;
       if (!contract_event.value.endsWith(value)) continue;
 
       return {

I am not entirely sure if that makes sense, but at least it keeps our fuzz tests running, which is what we want, though I thought I should let you know. /cc @lgalabru @hugocaillard @whoabuddy

This comment has been minimized.

Copy link
@hugocaillard

hugocaillard Nov 7, 2022

Author Collaborator

Totally right @moodmosaic, thanks for spotting it I'll PR a fix tomorrow

This comment has been minimized.

Copy link
@hugocaillard

hugocaillard Nov 8, 2022

Author Collaborator

cf #651

try {
let e: any = {};
e.contract_identifier =
event.contract_event.contract_identifier.expectPrincipal(
contract_identifier
);

if (event.contract_event.topic.endsWith("print")) {
e.topic = event.contract_event.topic;
} else {
continue;
}

if (event.contract_event.value.endsWith(value)) {
e.value = event.contract_event.value;
} else {
continue;
}
return e;
if (!contract_event.topic.endsWith("print")) continue;
if (!contract_event.value.endsWith(value)) continue;

return {
contract_identifier:
contract_event.contract_identifier.expectPrincipal(
contractIdentifier
),
topic: contract_event.topic,
value: contract_event.value,
};
} catch (error) {
console.warn(error);
continue;
}
}
throw new Error(`Unable to retrieve expected PrintEvent`);
throw new Error("Unable to retrieve expected PrintEvent");
};

Array.prototype.expectNonFungibleTokenTransferEvent = function (
tokenId: string,
sender: string,
recipient: string,
assetAddress: string,
assetId: string
tokenId,
sender,
recipient,
assetAddress,
assetId
) {
for (let event of this) {
for (let { nft_transfer_event } of this) {
try {
let e: any = {};
if (event.nft_transfer_event.value === tokenId) {
e["tokenId"] = event.nft_transfer_event.value;
} else {
if (nft_transfer_event.value !== tokenId) continue;
if (nft_transfer_event.asset_identifier !== `${assetAddress}::${assetId}`)
continue;
}
e["sender"] = event.nft_transfer_event.sender.expectPrincipal(sender);
e["recipient"] =
event.nft_transfer_event.recipient.expectPrincipal(recipient);
if (
event.nft_transfer_event.asset_identifier ===
`${assetAddress}::${assetId}`
) {
e["assetId"] = event.nft_transfer_event.asset_identifier;
} else {
continue;
}
return e;

return {
tokenId: nft_transfer_event.value,
sender: nft_transfer_event.sender.expectPrincipal(sender),
recipient: nft_transfer_event.recipient.expectPrincipal(recipient),
assetId: nft_transfer_event.asset_identifier,
};
} catch (_error) {
continue;
}
}
throw new Error(`Unable to retrieve expected NonFungibleTokenTransferEvent`);
throw new Error("Unable to retrieve expected NonFungibleTokenTransferEvent");
};

Array.prototype.expectNonFungibleTokenMintEvent = function (
tokenId: string,
recipient: string,
assetAddress: string,
assetId: string
tokenId,
recipient,
assetAddress,
assetId
) {
for (let event of this) {
for (let { nft_mint_event } of this) {
try {
let e: any = {};
if (event.nft_mint_event.value === tokenId) {
e.tokenId = event.nft_mint_event.value;
} else {
if (nft_mint_event.value !== tokenId) continue;
if (nft_mint_event.asset_identifier !== `${assetAddress}::${assetId}`)
continue;
}
e.recipient = event.nft_mint_event.recipient.expectPrincipal(recipient);
if (
event.nft_mint_event.asset_identifier === `${assetAddress}::${assetId}`
) {
e.assetId = event.nft_mint_event.asset_identifier;
} else {
continue;
}
return e;

return {
tokenId: nft_mint_event.value,
recipient: nft_mint_event.recipient.expectPrincipal(recipient),
assetId: nft_mint_event.asset_identifier,
};
} catch (_error) {
continue;
}
}
throw new Error(`Unable to retrieve expected NonFungibleTokenMintEvent`);
throw new Error("Unable to retrieve expected NonFungibleTokenMintEvent");
};

Array.prototype.expectNonFungibleTokenBurnEvent = function (
tokenId: string,
sender: string,
assetAddress: string,
assetId: string
tokenId,
sender,
assetAddress,
assetId
) {
for (let event of this) {
try {
let e: any = {};
if (event.nft_burn_event.value === tokenId) {
e.tokenId = event.nft_burn_event.value;
} else {
continue;
}
e.sender = event.nft_burn_event.sender.expectPrincipal(sender);
if (event.nft_burn_event.value !== tokenId) continue;
if (
event.nft_burn_event.asset_identifier === `${assetAddress}::${assetId}`
) {
e.assetId = event.nft_burn_event.asset_identifier;
} else {
event.nft_burn_event.asset_identifier !== `${assetAddress}::${assetId}`
)
continue;
}
return e;

return {
assetId: event.nft_burn_event.asset_identifier,
tokenId: event.nft_burn_event.value,
sender: event.nft_burn_event.sender.expectPrincipal(sender),
};
} catch (_error) {
continue;
}
}
throw new Error(`Unable to retrieve expected NonFungibleTokenBurnEvent`);
throw new Error("Unable to retrieve expected NonFungibleTokenBurnEvent");
};

const noColor = Deno.noColor ?? true;
Expand Down
Loading

0 comments on commit de04217

Please sign in to comment.