Skip to content

Commit

Permalink
fix: Resource binding can bind one of lock or type, or bind lock and …
Browse files Browse the repository at this point in the history
…type (#509)

* fix: Resource binding can bind one of lock or type, or bind lock and type.

* fix: Use object to transfer lock or type.
  • Loading branch information
yanguoyu authored Oct 25, 2023
1 parent 9fabbdb commit 784a67e
Show file tree
Hide file tree
Showing 7 changed files with 159 additions and 77 deletions.
3 changes: 1 addition & 2 deletions packages/io/__tests__/listener.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ describe('test Listener', () => {
getCurrentEpoch: () => Promise.resolve(mockEpoch),
getBlock: () => Promise.resolve(mockBlock),
getAllLiveCellsWithWitness: function (
_lockScript: Script,
_typeScript?: Script,
_scripts: Partial<Record<'lock' | 'type', Script>>,
): Promise<(CKBComponents.IndexerCell & { witness: string })[]> {
return Promise.resolve([])
},
Expand Down
37 changes: 31 additions & 6 deletions packages/io/src/chain-source/nervos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ import type { CKBComponents } from '@ckb-lumos/rpc/lib/types/api'
export class NervosChainSource implements ChainSource {
#rpc: RPC

constructor(rpcUrl: string, private _getCellsLimit: number = 1000) {
constructor(
rpcUrl: string,
private _getCellsLimit: number = 1000,
) {
this.#rpc = new RPC(rpcUrl)
}

Expand All @@ -21,8 +24,7 @@ export class NervosChainSource implements ChainSource {
}

getAllLiveCellsWithWitness = async (
lockScript: Script,
typeScript?: Script | undefined,
scripts: Partial<Record<'lock' | 'type', Script>>,
startBlock?: BI,
endBlock?: BI,
) => {
Expand All @@ -32,13 +34,36 @@ export class NervosChainSource implements ChainSource {
endBlock = endBlock ?? BI.from(await this.getTipBlockNumber())

let lastCursor = ''
let scriptFilterOption: CKBComponents.GetCellsSearchKey<true> | undefined = undefined
if (scripts.lock && scripts.type) {
scriptFilterOption = {
script: scripts.lock,
scriptType: 'lock',
filter: {
script: scripts.type,
},
withData: true,
}
} else if (scripts.lock) {
scriptFilterOption = {
script: scripts.lock,
scriptType: 'lock',
withData: true,
}
} else if (scripts.type) {
scriptFilterOption = {
script: scripts.type,
scriptType: 'type',
withData: true,
}
}
if (!scriptFilterOption) throw new Error('One of lock script or type script is required at least')
do {
const cells = await this.#rpc.getCells(
{
script: lockScript,
scriptType: 'lock',
...scriptFilterOption,
filter: {
script: typeScript,
...scriptFilterOption?.filter,
blockRange: [startBlock.toHexString(), endBlock.toHexString()],
},
},
Expand Down
3 changes: 1 addition & 2 deletions packages/io/src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ export interface ChainSource {
getCurrentEpoch: () => Promise<CKBComponents.Epoch>
getBlock: (blockNumber: string) => Promise<CKBComponents.Block | undefined>
getAllLiveCellsWithWitness: (
lockScript: Script,
typeScript?: Script,
scripts: Partial<Record<'lock' | 'type', Script>>,
) => Promise<(CKBComponents.IndexerCell & { witness: CKBComponents.Witness })[]>
}

Expand Down
37 changes: 19 additions & 18 deletions packages/models/__tests__/binding-resource/manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,7 @@ const mockSource: ChainSource = {
throw new Error('Function not implemented.')
},
getAllLiveCellsWithWitness: function (
_lockScript: Script,
_typeScript?: Script,
_scripts: Partial<Record<'lock' | 'type', Script>>,
): Promise<(CKBComponents.IndexerCell & { witness: string })[]> {
return Promise.resolve([])
},
Expand All @@ -99,8 +98,7 @@ describe('Test resource binding', () => {
throw new Error('Function not implemented.')
},
getAllLiveCellsWithWitness: function (
_lockScript: Script,
_typeScript?: Script,
_scripts: Partial<Record<'lock' | 'type', Script>>,
): Promise<(CKBComponents.IndexerCell & { witness: string })[]> {
const witness = '0x'
const cell: Cell = {
Expand Down Expand Up @@ -181,7 +179,7 @@ describe('Test resource binding', () => {
},
},
})
expect(manager.registry.get(TypeScriptHash)?.get(LockScriptHash)).toEqual(
expect(manager.registry.getRegistry(LockScriptHash, TypeScriptHash)).toEqual(
new Map<ActorURI, ResourceBindingRegistry>([
[
'local://store',
Expand All @@ -202,7 +200,7 @@ describe('Test resource binding', () => {
]),
)
await setTimeout(2000)
expect(manager.registry.get(TypeScriptHash)?.get(LockScriptHash)).toEqual(
expect(manager.registry.getRegistry(LockScriptHash, TypeScriptHash)).toEqual(
new Map<ActorURI, ResourceBindingRegistry>([
[
'local://store',
Expand All @@ -222,7 +220,7 @@ describe('Test resource binding', () => {
],
]),
)
expect(manager.registryReverse.get(ref.uri)).toEqual([TypeScriptHash, LockScriptHash])
expect(manager.registry.getRegistryByUri(ref.uri)).toEqual([LockScriptHash, TypeScriptHash])
expect(mockXAdd).toBeCalledTimes(2)
})
})
Expand Down Expand Up @@ -259,8 +257,8 @@ describe('Test resource binding', () => {
},
},
})
expect(manager.registry.get(TypeScriptHash)?.get(LockScriptHash)).toEqual(new Map())
expect(manager.registryReverse.get(ref.uri)).toBeUndefined()
expect(manager.registry.getRegistry(LockScriptHash, TypeScriptHash)).toEqual(new Map())
expect(manager.registry.getRegistryByUri(ref.uri)).toBeUndefined()
})

it('will to nothing when no registry', () => {
Expand Down Expand Up @@ -347,8 +345,7 @@ describe('Test resource binding', () => {
return Promise.resolve(mockBlock)
},
getAllLiveCellsWithWitness: function (
_lockScript: Script,
_typeScript?: Script,
_scripts: Partial<Record<'lock' | 'type', Script>>,
): Promise<(CKBComponents.IndexerCell & { witness: string })[]> {
return Promise.resolve([])
},
Expand Down Expand Up @@ -400,7 +397,12 @@ describe('Test resource binding', () => {
jest.spyOn(CellChangeBuffer.prototype, 'popAll').mockImplementationOnce(() => [[change]])
jest.spyOn(CellChangeBuffer.prototype, 'hasReadyStore').mockImplementationOnce(() => true)

manager.register(cell.cellOutput.lock, cell.cellOutput.type, registry.uri, 'normal')
manager.register({
lockScript: cell.cellOutput.lock,
typeScript: cell.cellOutput.type,
uri: registry.uri,
pattern: 'normal',
})
listener = manager.listen()
await setTimeout(2000)
expect(mockXAdd).toBeCalledTimes(2)
Expand All @@ -422,8 +424,7 @@ describe('Test resource binding', () => {
throw new Error('Function not implemented.')
},
getAllLiveCellsWithWitness: function (
_lockScript: Script,
_typeScript?: Script,
_scripts: Partial<Record<'lock' | 'type', Script>>,
): Promise<(CKBComponents.IndexerCell & { witness: string })[]> {
return Promise.resolve([])
},
Expand Down Expand Up @@ -845,10 +846,10 @@ describe('Test resource binding', () => {
expect(manager.lastBlock?.header.number).toEqual(mockBlock0.header.number)
mockSource.getTipHeader = () => Promise.resolve(mockBlock.header)
mockSource.getBlock = () => Promise.resolve(mockBlock)
manager.register(outputA.lock, outputA.type, ref1.uri, 'normal')
manager.register(outputE.lock, outputE.type, ref1.uri, 'normal')
manager.register(outputD.lock, outputD.type, ref2.uri, 'normal')
manager.register(outputC.lock, outputC.type, ref2.uri, 'normal')
manager.register({ lockScript: outputA.lock, typeScript: outputA.type, uri: ref1.uri, pattern: 'normal' })
manager.register({ lockScript: outputE.lock, typeScript: outputE.type, uri: ref1.uri, pattern: 'normal' })
manager.register({ lockScript: outputD.lock, typeScript: outputD.type, uri: ref2.uri, pattern: 'normal' })
manager.register({ lockScript: outputC.lock, typeScript: outputC.type, uri: ref2.uri, pattern: 'normal' })

await setTimeout(2000)
expect(mockXAdd).toBeCalledTimes(2)
Expand Down
Loading

0 comments on commit 784a67e

Please sign in to comment.