-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
8d0ebcd
commit 439e737
Showing
6 changed files
with
353 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
import { NotAllowedTokenBurning } from "../errors"; | ||
import { regularBoxesMock } from "../tests/mocks/mockBoxes"; | ||
import { OutputBuilder } from "./outputBuilder"; | ||
import { createPluginContext, FleetPluginContext } from "./pluginContext"; | ||
import { TransactionBuilder } from "./transactionBuilder"; | ||
|
||
describe("Plugin context", () => { | ||
const creationHeight = 894169; | ||
let builder!: TransactionBuilder; | ||
let context!: FleetPluginContext; | ||
|
||
beforeEach(() => { | ||
builder = new TransactionBuilder(creationHeight); | ||
context = createPluginContext(builder); | ||
}); | ||
|
||
it("Should add inputs", () => { | ||
const fromMethod = jest.spyOn(builder, "from"); | ||
const configureSelectorMethod = jest.spyOn(builder, "configureSelector"); | ||
|
||
const newLen = context.addInputs(regularBoxesMock); | ||
|
||
expect(fromMethod).toBeCalledTimes(1); | ||
expect(configureSelectorMethod).toBeCalledTimes(1); | ||
expect(builder.inputs).toHaveLength(newLen); | ||
expect(builder.inputs).toHaveLength(regularBoxesMock.length); | ||
}); | ||
|
||
it("Should add a single input", () => { | ||
const fromMethod = jest.spyOn(builder, "from"); | ||
const configureSelectorMethod = jest.spyOn(builder, "configureSelector"); | ||
|
||
let newLen = context.addInputs(regularBoxesMock[0]); | ||
expect(fromMethod).toBeCalledTimes(1); | ||
expect(configureSelectorMethod).toBeCalledTimes(1); | ||
expect(builder.inputs).toHaveLength(newLen); | ||
expect(builder.inputs).toHaveLength(1); | ||
|
||
newLen = context.addInputs(regularBoxesMock[1]); | ||
expect(fromMethod).toBeCalledTimes(2); | ||
expect(configureSelectorMethod).toBeCalledTimes(2); | ||
expect(builder.inputs).toHaveLength(newLen); | ||
expect(builder.inputs).toHaveLength(2); | ||
}); | ||
|
||
it("Should add data inputs", () => { | ||
const withDataFromMethod = jest.spyOn(builder, "withDataFrom"); | ||
|
||
const newLen = context.addDataInputs(regularBoxesMock); | ||
|
||
expect(withDataFromMethod).toBeCalledTimes(1); | ||
expect(builder.dataInputs).toHaveLength(newLen); | ||
expect(builder.dataInputs).toHaveLength(regularBoxesMock.length); | ||
}); | ||
|
||
it("Should add outputs", () => { | ||
const toMethod = jest.spyOn(builder, "to"); | ||
|
||
let newLen = context.addOutputs( | ||
new OutputBuilder(10000n, "9gn5Jo6T7m4pAzCdD9JFdRMPxnfKLPgcX68rD8RQvPLyJsTpKcq") | ||
); | ||
|
||
expect(toMethod).toBeCalledTimes(1); | ||
expect(newLen).toBe(builder.outputs.length); | ||
|
||
newLen = context.addOutputs( | ||
new OutputBuilder(20000n, "9gn5Jo6T7m4pAzCdD9JFdRMPxnfKLPgcX68rD8RQvPLyJsTpKcq") | ||
); | ||
|
||
expect(toMethod).toBeCalledTimes(2); | ||
expect(builder.outputs).toHaveLength(newLen); | ||
expect(builder.outputs).toHaveLength(2); | ||
}); | ||
|
||
it("Should burn tokens, plugin context allowed", () => { | ||
const burnTokensMethod = jest.spyOn(builder, "burnTokens"); | ||
|
||
builder | ||
.from(regularBoxesMock) | ||
.configure((settings) => settings.allowTokenBurningFromPlugins(true)); | ||
|
||
context.burnTokens([ | ||
{ tokenId: "bf2afb01fde7e373e22f24032434a7b883913bd87a23b62ee8b43eba53c9f6c2", amount: 1n }, | ||
{ tokenId: "007fd64d1ee54d78dd269c8930a38286caa28d3f29d27cadcb796418ab15c283", amount: 126n } | ||
]); | ||
|
||
expect(burnTokensMethod).toBeCalledTimes(1); | ||
expect(builder.burning).toHaveLength(2); | ||
}); | ||
|
||
it("Should burn tokens, globally allowed", () => { | ||
const burnTokensMethod = jest.spyOn(builder, "burnTokens"); | ||
|
||
builder.from(regularBoxesMock).configure((settings) => settings.allowTokenBurning(true)); | ||
|
||
context.burnTokens([ | ||
{ tokenId: "bf2afb01fde7e373e22f24032434a7b883913bd87a23b62ee8b43eba53c9f6c2", amount: 1n }, | ||
{ tokenId: "007fd64d1ee54d78dd269c8930a38286caa28d3f29d27cadcb796418ab15c283", amount: 126n } | ||
]); | ||
|
||
expect(burnTokensMethod).toBeCalledTimes(1); | ||
expect(builder.burning).toHaveLength(2); | ||
}); | ||
|
||
it("Should fail if token burning is not allowed", () => { | ||
const burnTokensMethod = jest.spyOn(builder, "burnTokens"); | ||
|
||
builder.from(regularBoxesMock); | ||
|
||
expect(() => { | ||
context.burnTokens([ | ||
{ tokenId: "bf2afb01fde7e373e22f24032434a7b883913bd87a23b62ee8b43eba53c9f6c2", amount: 1n }, | ||
{ | ||
tokenId: "007fd64d1ee54d78dd269c8930a38286caa28d3f29d27cadcb796418ab15c283", | ||
amount: 126n | ||
} | ||
]); | ||
}).toThrow(NotAllowedTokenBurning); | ||
|
||
expect(burnTokensMethod).not.toBeCalled(); | ||
expect(builder.burning).toBeUndefined(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
import { Amount, Box, OneOrMore, TokenAmount } from "@fleet-sdk/common"; | ||
import { NotAllowedTokenBurning, OutputBuilder, TransactionBuilder } from ".."; | ||
import { CollectionAddOptions } from "../models/collections/collection"; | ||
|
||
export type FleetPluginContext = { | ||
/** | ||
* Add and ensures selection of one or more inputs to the inputs list | ||
* @param inputs | ||
* @returns new list length | ||
*/ | ||
addInputs: (inputs: OneOrMore<Box<Amount>>, options?: CollectionAddOptions) => number; | ||
|
||
/** | ||
* Add one or more data inputs to the data inputs list | ||
* @param dataInputs | ||
* @returns new list length | ||
*/ | ||
addDataInputs: (dataInputs: OneOrMore<Box<Amount>>, options?: CollectionAddOptions) => number; | ||
|
||
/** | ||
* Add one or more outputs to the outputs list | ||
* @param outputs | ||
* @param options | ||
* @returns new list length | ||
*/ | ||
addOutputs: (outputs: OneOrMore<OutputBuilder>, options?: CollectionAddOptions) => number; | ||
|
||
/** | ||
* Burn tokens | ||
* @param tokens | ||
* @throws Burning tokens thought a plugin, requires explicitly permission | ||
* from {@link TransactionBuilder.configure}, if token burning is not allowed | ||
* it will thrown a {@link NotAllowedTokenBurning} exception. | ||
*/ | ||
burnTokens: (tokens: OneOrMore<TokenAmount<Amount>>) => void; | ||
}; | ||
|
||
export function createPluginContext(transactionBuilder: TransactionBuilder): FleetPluginContext { | ||
return { | ||
addInputs: (inputs, options) => | ||
transactionBuilder | ||
.from(inputs, options) | ||
.configureSelector((selector) => | ||
selector.ensureInclusion( | ||
Array.isArray(inputs) ? inputs.map((input) => input.boxId) : inputs.boxId | ||
) | ||
).inputs.length, | ||
addOutputs: (outputs, options) => transactionBuilder.to(outputs, options).outputs.length, | ||
addDataInputs: (dataInputs, options) => | ||
transactionBuilder.withDataFrom(dataInputs, options).dataInputs.length, | ||
burnTokens: (tokens) => { | ||
if (!transactionBuilder.settings.canBurnTokensFromPlugins) { | ||
throw new NotAllowedTokenBurning(); | ||
} | ||
transactionBuilder.burnTokens(tokens); | ||
} | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.